본문 바로가기
System Hacking/해커스쿨 F.T.Z Hacking Zone

해커스쿨 F.T.Z Level 16

by En_Geon 2020. 2. 27.

level 16 로그인 후 hint를 본다.

 

level 16 hint

 

level 16에서는 함수를 선언해 main에서 함수를 불러 실행한다.

hint에서는 shell 함수가 사용되지 않고 있고 printit 함수만 사용된다.

 

이 정도만 봐도 hint는 대충 파악이 될 것으로 생각한다.

이제 gdb를 열어본다.

 

gdb attackme

 

gdb에서 중요한 것은 main+3, main+6, main+36, main+39다.

main+3에서 0x38(56)byte를 확보 후 main+6에서 0x8048500 주솟값을 ebp-16에 저장한다.

main+36에서 ebp-16을 eax에 저장하고 main+39에서 call 한다.

 

gdb를 보고 프로그램을 실행하면 0x8048500의 주소에 무슨 데이터를 가졌는지 알 수 있다.

 

attackme 실행

 

"Hello there!"가 나오는 거로 봐서 printit() 함수가 들어있다 생각할 수 있다.

gdb로 printit() 함수를 정확하게 찾아보면 printit() 함수의 주소를 알 수 있다.

 

disas printit

 

여기서는 디스어셈블을 main으로 주는 것이 아니라 printit() 함수로 준다. 그러면 그 함수에 대해 디스어셈블을 할 수 있다. printit() 함수의 시작 주소를 보게 되면 0x08048500이다. 위 main에서 ebp-16에 들어가는 주소와 같다.

 

지금까지 BOF 문제를 잘 풀어왔다면 여기서 문제를 어떻게 풀어야 하는지 생각이 났을 것이다.

 

더보기

 

그렇다.

위 printit() 함수의 주소가 ebp-16에 들어갈 때 BOF 공격으로 printit() 함수가 아닌 shell() 함수의 주소를 넣어주면 된다.

그렇다면 shell() 함수의 주소를 알아야 한다.

 

disas shell

 

shell() 함수의 시작 주소는 0x080484d0다.

이제 공격 준비는 끝이 났고 공격을 한다.

 

공격 실행

'System Hacking > 해커스쿨 F.T.Z Hacking Zone' 카테고리의 다른 글

해커스쿨 F.T.Z Level 18  (0) 2020.02.29
해커스쿨 F.T.Z Level 17  (0) 2020.02.27
해커스쿨 F.T.Z Level 15  (0) 2020.02.26
해커스쿨 F.T.Z Level 14  (0) 2020.02.24
해커스쿨 F.T.Z Level 13  (0) 2020.02.24

댓글