level 16 로그인 후 hint를 본다.
level 16에서는 함수를 선언해 main에서 함수를 불러 실행한다.
hint에서는 shell 함수가 사용되지 않고 있고 printit 함수만 사용된다.
이 정도만 봐도 hint는 대충 파악이 될 것으로 생각한다.
이제 gdb를 열어본다.
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의 주소에 무슨 데이터를 가졌는지 알 수 있다.
"Hello there!"가 나오는 거로 봐서 printit() 함수가 들어있다 생각할 수 있다.
gdb로 printit() 함수를 정확하게 찾아보면 printit() 함수의 주소를 알 수 있다.
여기서는 디스어셈블을 main으로 주는 것이 아니라 printit() 함수로 준다. 그러면 그 함수에 대해 디스어셈블을 할 수 있다. printit() 함수의 시작 주소를 보게 되면 0x08048500이다. 위 main에서 ebp-16에 들어가는 주소와 같다.
지금까지 BOF 문제를 잘 풀어왔다면 여기서 문제를 어떻게 풀어야 하는지 생각이 났을 것이다.
그렇다.
위 printit() 함수의 주소가 ebp-16에 들어갈 때 BOF 공격으로 printit() 함수가 아닌 shell() 함수의 주소를 넣어주면 된다.
그렇다면 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 |
댓글