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

설정

트랙백

댓글