Wargame/Hacker School FTZ2012. 9. 14. 12:55
Level15
pwd : guess what
Level14와 비슷합니다만
check가 포인터입니다.
buf에 deadbeef를 넣고 check가 가리키도록 만들면 간단히 해결 될 듯 합니다.
buf의 주소를 찾기 위해 gdb로 attackme를 열어봅니다.
buf에 접근하는 fgets 주변을 살펴봅니다.
buf의 시작 주소는 0xbffffaf0입니다.
이제 check의 위치를 찾아보겠습니다.
fgets에서 접근하는 buf의 주소는 0xffffffc8 (%ebp)이고
deadbeef 검사에서 접근하는 check의 주소는 0xfffffff0 (%ebp)입니다.
두 주소의 거리는 40(0x28)입니다.
check의 위치도 알았으니 공격해봅니다.
안됩니다.
아왜
gdb상에서의 주소와 실제 실행할 때의 주소가 다를 수도 있습니다.
정확한 이유는 잘 모릅니다만
gdb상에서 프로그램을 실행 할 때에는 절대주소를 사용하고
실제 사용할 때는 상대주소를 이용해 실행했습니다.
메모리상에서는 프로그램이 상대주소로 실행된건지 절대주소로 실행된건지를 저장하는 공간이 stack에 있다고 합니다.
아마 그 때문일거라 추측합니다.
gdb에서는 /home/level15/attackme로 실행했고
위의 방법에서는 ./attackme로 실행했습니다.
주소의 길이가 더 짧으니 deadbeef의 주소를 16-byte 크게 해보겠습니다.
바꾼 주소는 0xbffffb00입니다.
공격해봅니다.
level16의 shell이 떨어졌습니다.