본문 바로가기

코딩 문제/해커스쿨

FTZ : level16

728x90

hint를 확인한다.

shell 함수와 printit()함수가 있고 main함수로 제어를 하는 것 같다.

fgets 함수를 사용하였으므로 이전 문제들과 동일하게

BOF문제인 것 같다.

 

attackme 실행파일을 실행해보자.

40개를 입력하면 Segmentation fault가 나오고

39개를 입력하면 printit가 실행된다.

 

그렇다면 call()이 printit를 실행하도록 하는 것이니

call()이 shell을 실행하도록 하면 되겠다.

 

tmp 폴더로 복사하여 GDB디버거를 사용하여 자세히 보겠다.

함수가 3개 있으므로 3개를 전부 확인하겠다.

아래는 shell 함수이고

아래는 printit 함수이고

아래는 main 함수이다.

main 함수에서 main+3을 보면 0x38만큼 공간을 확보하는 것이 보인다.

0x38 = 56byte 이므로

메모리 구조는 buf 20byte와 crap 4byte, *call 4byte를 제외한

28byte의 dummy가 곳곳에 구성되어 있다.

 

main+24를 보게되면 %eax의 주소를 0xffffffc8(%ebp)로 담은다음

fgets함수를 이용하여 문자열을 받으니 buf의 위치를 알 수 있다.

 

main+36을 보면 %eax의 값을 0xfffffff0(%ebp)로 넣고나서

call 함수를 실행하니 *call의 위치 또한 알 수 있다.

 

그럼 buf와 *call 사이에는 40byte의 dummy가 있다는 것을 알 수 있다.

 

결국 메모리 구조는

buf 20byte + dummy 20byte + *call 4byte + dummy 4byte + crap 4byte + dummy 4byet + SFP 4byte + RET 4byte

가 된다.

 

그럼 이제 쉘함수의 주소를 한번 찾아보자.

위 그림을 보면 shell 함수의 주소가 보일 것이다.

0x080484d0

 

이제 나가서 실행해보자.

우선 40개의 NOP와 shell의 주소를 입력값으로 주겠다.

level17의 권한을 얻은 것을 확인하였다.

'코딩 문제 > 해커스쿨' 카테고리의 다른 글

FTZ : level18  (0) 2019.07.20
FTZ : level17  (0) 2019.07.19
FTZ : level15  (0) 2019.07.13
FTZ : level14  (0) 2019.07.13
FTZ : level13  (0) 2019.07.08