본문 바로가기

Pwnable/▷ Study

lob 18

plt를 이용하라는 문제다.

보면 strcpy로 오버플로우가 일어나는데 ret부분에 덮을 주소가 strcpy 주소여야한다.

그 다음 ret+4 에 'AAAA'로 바꾼다.

전에 lob 문제 풀때 보면 함수가 main, f1, f2, f3, f4, f5 이런식으로 있었는데 이 문제에서도 strcpy 때문에 오버플로우가 일어났었다. 

버퍼가 40이라고 가정하고 "A"*44 + (f1 시작주소) + (f2 시작주소) + (f3 시작주소) + (f4 시작주소) + (f5 시작주소)

이런식으로 payload 를 입력했는데 출력이 f1~5 함수 printf 내용이 다 출력되었다.

gdb로 leave ret에다 브포 걸어놓고 si ni 명령어 이용해서 하나하나 i reg esp, i reg ebp 치면서 스택구조를 보았던게 도움이 많이 되었다.

저 위에 페이로드는 아래와 같은 원리로 돌아간다.

(f1 시작주소) 로 덮은 부분은 main의 return address고,

(f2 시작주소) 로 덮은 부분은 f1 함수의 return address가 된다.

이런식으로 순서대로 덮어서 해당 함수로 리턴할 수 있게끔 해준것이 위에 페이로드다.

여기서 영감을 얻어서 문제를 풀었다.


main의 return address는 무조곤 strcpy 주소가 되어야하는데 payload는 아래와 같이 짜면 된다.

[payload]

(system[4]) + (dummy[4]) + (/bin/sh[4]) + dummy[32]) + (strcpy[4]) + (dummy[4]) + (dummy_address[4]) + (buf_start_address[4]) 

./nightmare `python -c 'print "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40" + "B"*32 + "\x10\x84\x04\x08" + "CCCC" + "\xc0\xfa\xff\xbf" + "\x90\xfa\xff\xbf"'`

설명을 해보자면 일단 main의 ret을 strcpy로 덮고 strcpy_plt로 점프하면 esp는 "CCCC" 시작주소에 가있다.

stack frame 에서 push ebp, mov ebp, esp 를 해주는데 push에서 -4가 되므로 esp는 "\x10\x84\x04\x08" 시작주소에 가있고 mov ebp, esp 를 해주면 ebp에 "\x10\x84\x04\x08" 시작주소가 담긴다.

strcpy에서 인자값으로 ebp+8, ebp+12 를 사용하는데 

ebp+8 부분은 "\xc0\xfa\xff\xbf"(dummy 주소)를 가리키고
ebp+12 부분은 "\x90\xfa\xff\xbf"(buf 주소를 가리킨다.
strcpy(dummy 주소, "buf 주소")

즉 memset에서 "AAAA"가 덮힌 값이 있는 주소에 strcpy를 이용하여 buf시작 주소로 덮게하는 원리다.

마지막에 leave ret 을 함으로써 buf 시작주소로 리턴되어 RTL이 실행된다.


'Pwnable > ▷ Study' 카테고리의 다른 글

pig_hunting  (2) 2018.03.01
lob 20  (0) 2018.02.21
ftz level20  (0) 2018.02.18
ftz level19  (0) 2018.02.18
ftz level18  (0) 2018.02.17