-->

[해커스쿨 FTZ] level16 풀이

FTZ level16 문제 확인

FTZ level16은 11~15와는 조금 다른 형태의 문제가 출제되었다. call() 함수포인터를 printit() 함수로 지정해놨는데 printit() 함수는 "Hello there!"이라는 문자열을 출력하고 끝난다.

 

쉘획득을 위한 shell() 함수를 실행시키는 것이 level16의 목표이다.

 

 

 

fgets가 있기때문에 48바이트까지는 입력할 수 있다.

 

 

 

FTZ level16 문제 풀이

쉘획득을 위한 shell() 함수를 실행시키는 방법 중에 하나로 call() 함수 포인터의 값으로 들어있는 printit() 함수의 주소를 shell() 함수로 변경하는 것이다.

 

일단, 스택 구조부터 확인해보자.

 

char buf[20] : 20바이트 (0x14) 
dummy : ? 
void *call : 4바이트 
dummy : ? 
int crap : 4바이트 
dummy : ? 
SFP : 4바이트 
RET : 4바이트

 

 

call() 함수 포인터의 값을 실제로 확인해보자. 'call eax'를 하고있으므로 eax 값을 확인해보면 된다. 

 

 

 

 

<main+39>에 bp를 건 후 확인해보면 eax는 0x8048500이고 printit 함수 시작 주소도 0x8048500임이 확인된다. 결국 buf를 통해 call 함수포인터 값을 shell() 함수 주소로 덮어쓰면 되는 것이다.

 

 

 

shell() 함수 시작 주소는 0x80484d0 이다.

 

 

 

스택을 봐보면, buf 시작 위치에서부터 0x8048500은 +40바이트에 위치하는 것을 알 수 있다.

 

 

 

FTZ level16 exploit code

따라서 앞에 40바이트를 채운 후에 shell() 함수 주소를 쓰는 식으로 FTZ level16 익스플로잇 코드를 작성할 수 있다.

 

(python -c 
'print 
"\x90"*40 
+"\xb2\x84\x04\x08"';cat) | ./attackme

 

 

그럼, 다음과 같이 level17으로 가는 쉘과 비밀번호를 얻게 된다.

 

 

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

[해커스쿨 FTZ] level18 풀이  (0) 2020.02.15
[해커스쿨 FTZ] level17 풀이  (0) 2020.02.14
[해커스쿨 FTZ] level15 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level14 풀이  (0) 2020.02.13
[해커스쿨 FTZ] level13 풀이  (0) 2020.02.13

댓글

Designed by JB FACTORY