#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
[그림 1-1] 참조하면 system 함수 주소, /bin/sh 주소 가 필요하다. dummy 값은 system 함수 종료 후 다른 함수로 안뛰어도 되니까 쓰레기 값으로 넣어둔다.
프로그램이 메모리에 올라가면 plt, got 테이블에서 system 함수에 대한 정보를 가지고 있다. 따라서 system 함수 주소를 얻을 수 있다.
run 을 통해 꼭 실행시켜야지 주소를 얻을 수 있다.
프로그램이 메모리에 올라가면 /bin/sh 주소도 올라가 있는다. -> run 해야함
find 통해 메모리상에 string을 찾는다.
system 함수 주소, /bin/sh 주소는 메모리에 올라갈 때마다 변한다 -> ASLR
따라서 ASLR을 꼭 꺼야한다.
ASLR 끄고 실행하면 쉘을 딴다.
https://jeongzero.oopy.io/570682fc-ef3e-4d83-9e55-7d28b0ef02dc
RTL 설명이 너무너무 잘되어있다..