stack5 - Return to libc(RTL)

oogu ㅣ 2022. 9. 7. 23:06

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}

stack5 문제를 RTL 방법으로 풀어보자

 

이전 stack 문제에서는 win 함수가 존재해 ret 값을 win 함수 주소로 변경하면 됐다. 하지만 win 함수가 존재하지 않기 때문에 ret 값을 system 함수 주소를 넣고 /bin/sh 실행시켜 보자

 

payload = "A"* 76 + system 함수 주소 + dummy + /bin/sh 주소

 

*내 추측*

payload 작성시 주의해야할 점은 dummy 값을 넣어줘야 한다는 것이다. 그 이유는 system 함수를 정상적으로 call 한 것이 아니기 때문에 스택에 system 함수 종료 후 돌아갈 ret 값이 들어가지 않는다. 즉, dummy 값을 넣어줌으로써 ret 역할을 수행하는 것이다. -> system 함수 내부 동작은 정상적인 call 이던 비정상적인 call 이던 똑같이 돌아간다. 

system 함수 종료 후 다른 함수를 또 호출하고 싶다면(RTL chaining) dummy 값에 호출하고싶은 함수 주소를 넣으면 된다.

 

RTL 동작 과정을 아래 블로그를 참고하자

https://rninche01.tistory.com/18 

 

RTL(Return-To-Libc) 원리 및 실습

1. RTL(Return To Libc) 사용자가 작성한 코드에 없는 함수를 호출하고자 메모리에 이미 적재된 공유 라이브러리의 원하는 함수를 사용할 수 있는 기법이다. 또한, 리눅스의 메모리 보호 기법 중 NX bit

rninche01.tistory.com

 

[그림 1-1]

[그림 1-1] 참조하면 system 함수 주소, /bin/sh 주소 가 필요하다. dummy 값은 system 함수 종료 후 다른 함수로 안뛰어도 되니까 쓰레기 값으로 넣어둔다.

 

[그림 1-2]

프로그램이 메모리에 올라가면 plt, got 테이블에서 system 함수에 대한 정보를 가지고 있다. 따라서 system 함수 주소를 얻을 수 있다.  

run 을 통해 꼭 실행시켜야지 주소를 얻을 수 있다.

 

[그림 1-3]

프로그램이 메모리에 올라가면 /bin/sh 주소도 올라가 있는다. -> run 해야함

find 통해 메모리상에 string을 찾는다.

[그림 1-4]

system 함수 주소, /bin/sh 주소는 메모리에 올라갈 때마다 변한다 -> ASLR

따라서 ASLR을 꼭 꺼야한다.

[그림 1-5]

ASLR 끄고 실행하면 쉘을 딴다.

 

 

 

 

https://jeongzero.oopy.io/570682fc-ef3e-4d83-9e55-7d28b0ef02dc

 

RTL 기법 파헤치기

Return To Library, 즉 RTL 이라는 불리는 공격기법에 대해서 알아보자

jeongzero.oopy.io

RTL 설명이 너무너무 잘되어있다..

'protostar' 카테고리의 다른 글

stack7  (0) 2022.09.11
stack6  (0) 2022.09.09
stack5 - 쉘 코드  (0) 2022.09.07
stack4  (0) 2022.09.07
stack3  (0) 2022.09.07