hint를 확인한다.
늘 그렇듯 BOF문제이다.
level16과 차이가 있다면 level16은 다음단계의 권한을 얻어 쉘을 자동으로 실행하는 함수가 있었지만
이번 문제에는 없다.
그럼 직접 쉘을 넣어줘야 겠다는 생각이 든다.
attackme를 한번 실행해보자.
실행하였을 때 printit가 실행되니 이 call 함수를 이용하여
내가 넣은 쉘을 실행하도록 해야겠다는 생각이 든다.
tmp 폴더로 실행파일을 복사하여 GDB 디버거를 실행해보자.
main+3에서 0x38의 공간을 확보한다고 되어있다.
main+24를 보면 %eax를 0xffffffc8에 넣고 fgets 함수를 사용하여 문자를 입력받는다고 되어있다.
그렇다면 buf의 위치를 0xffffffc8로 생각해두자.
그리고 main+57을 보게되면 %eax를 0xfffffff0에 넣고나서 call함수를 실행하는 것이 보인다.
그렇다면 call 함수의 위치는 0xfffffff0로 알 수 있다.
메모리 구조를 계산해 보면
buf 20byte, *call 4byte, crap 4byte이므로 dummy가 28byte가 된다.
그런데 buf와 *call의 위치 차이는 40byte이므로
buf 20byte + dummy 20byte + *call 4byte + dummy 4byte + crap 4byte + dummy 4byte + SFP 4byte + RET 4byte
가 된다.
아까 생각한 풀이방법은 *call을 이용한 것이므로
buf 20byte와 dummy 20byte 총 40byte에 쉘코드 25byte와 NOP 15byte를 넣고 *call의 위치에 쉘의 위치를
덮어 씌워보겠다.
우선 실행시 저장되는 buf의 주소를 확인해 보자.
실제 저장되는 주소는 0xbffff8a0 이다.
이제 level17 폴더로 돌아가서 코드를 작성해보자.
아까 말했듯이 쉘코드 25byte를 넣은다음 NOP코드 15byte를 넣고 *call의 위치에 쉘의 위치
즉. buf가 저장되는 위치를 넣어주었다.
수십번의 Segmentation fault가 뜨고 나서야 권한을 얻었다.
level18로 가는 Password를 얻어주자.
'코딩 문제 > 해커스쿨' 카테고리의 다른 글
FTZ : level19 (0) | 2019.07.22 |
---|---|
FTZ : level18 (0) | 2019.07.20 |
FTZ : level16 (0) | 2019.07.14 |
FTZ : level15 (0) | 2019.07.13 |
FTZ : level14 (0) | 2019.07.13 |