글
FTZ level16 write up
포너블
2020. 3. 17. 21:01

level 16의 코드를 살펴보면 이렇다.
fgets함수에서 BOF가 일어남을 알 수 있으며,
call포인터에 printf함수를 저장하고 man()함수의 마지막에 호출을 한다.
printit을 가리키고 있는 call의 주소값을 shell 함수 주소로 변조한다면 level17의 패스워드 값을 얻을 수 있을 것 같다.

gdb로 분석해본 것이다.
<main+28>에서 <main+39>까지 보면 될 것 같다.
우선 <mainn+28>에서 feget함수를 호출하고
<mainn+33>에서 esp에 16바이트만큼 스택에서 뺀다
<main+36>에서 ebp-16의 값을 eax로 복사하고
<main+39>에서 eax을 호출한다고 하였다.
근데 처음 코드를 보면 main 함수 마지막 부분에서 call 포인터를 호출하는 것을 알 수 있다.
즉, ebp -16위치에 shell함수 주소를 넣어 call eax를 호출 할 때 shell 함수가 호출되도록 변경하면 될 것같다.
그럼 이제 shell함수가 위치한 주소를 알아야 한다!!!!

gdb에 disass shell을 입력해서 shell 함수 시작 주소를 확인한다.
0x080484d0 임을 확인했다!!!
buf[20]에서부터 call함수까지의 거리는 40이다.
(python -c 'print "A"*40+"\xd0\x84\x04\x08"';cat) | ./attackme
을 입력하면 level17의 패스워드 값을 얻을 수 있다.
'포너블' 카테고리의 다른 글
| FTZ level18 write up (1) | 2020.03.20 |
|---|---|
| FTZ level17 write up (0) | 2020.03.17 |
| FTZ level15 write up (0) | 2020.03.16 |
| FTZ level14 write up (0) | 2020.03.16 |
| FTZ level13 write up (0) | 2020.03.16 |