level16 이다. 고지가 얼마 남지 않았다!
로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.
코드를 분석해보자.
call 포인터 함수에 저장되어있는 printit 함수를 호출하는 코드이다. 이 printit 함수를 shell 함수로 바꾸어 저장한다면 마지막에 shell 함수가 호출되면서 다음 암호가 나올 것 같다.
그렇다면 해야 할 것은 ⓐbuf 와 *call 까지의 거리를 알아내고 ⓑshell 함수의 주소를 알아내 ⓒ그 주소를 *call위치에 넣어주면 될것이다.
gdb로 정확하게 분석을 해보자.
일단 main 함수를 뜯어보자.
buf 와 *call 사이의 거리 = 56 - 16 = 40 이다.
( buf ~ ret, *call ~ ret 사이의 거리는 둘다 4 이므로 결과에 관련이 없다.)
이제 shell 함수의 주소를 찾아보자.
0x080484d0 임을 확인했다.
P 명령어로도 아래와 같이 확인 할 수 있다.
알아야 할 건 다 알았으니 이제 *call 위치에 0x080484d0을 넣는 페이로드를 작성하자.
(python -c 'print "\x90"*40+"\xd0\x84\x04\x08"'; cat) | ./attackme
짜잔
level17 암호 : king poetic
'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글
[해커스쿨 FTZ] level18 (0) | 2020.03.12 |
---|---|
[해커스쿨 FTZ] level17 (0) | 2020.03.12 |
[해커스쿨 FTZ] level15 (0) | 2020.03.12 |
[해커스쿨 FTZ] level14 (0) | 2020.03.12 |
[해커스쿨 FTZ] level13 (0) | 2020.03.12 |