fkillrra 2017. 11. 12. 18:29

엄청난 뻘짓끝에 F.T.Z level 14도 풀이를 했습니다.


level14 풀이를 해보았습니다.



로그인 후 level15에 실행 권한이 주어진 파일을 찾은 모습입니다. 


간단히 ls -al 명령어로 찾을 수 있습니다.


이번에도 변태같은 attackme가 공격을 바라며 기다리고 있네요 ㅎ



힌트 파일을 열어 힌트를 확인 해 보니..


char buf[20]; 으로 20 byte 크기의 배열이 존재합니다.


하지만 크기에 맞지 않게 fgets() 함수에서는 45 byte 를 입력받고 있는 모습입니다.


따라서 버퍼오버플로우 취약점이 존재하는 것을 확인 할 수 있습니다.


또한 if 문의 조건으로 check 이라는 int 형 변수에 0xdeadbeef 라는 문자가 존재한다면 쉘을 실행 시켜 주네요. ㅎ


저 if 문의 조건만 만족시키면 될것같습니다.  ㅎㅎ


하지만!! 


우리는 실제로 버퍼를 얼마나 할당 되었는지 확인할 필요가 있죠? 


int 형으로 선언된 check의 위치를 알아야 거기에 0xdeadbeef 라는 문자열을 넣고,

 쉘을 실행시킬 수 있기 때문입니다.


여기서 이전의 방법과 동일하게 tmp 디렉터리로 attackme라는 파일을 복사해주었고


gdb로 disas main을 해보았습니다.



여기서 buf는 ebp-56 의 위치에 있고, check 은 ebp-16의 위치에 있는것을 확인 할 수 있었는데요


이는 lea eax, [ebp-56] 과

cmp DWORD PTR [ebp-16], 0xdeadbeef 에서 확인할 수 있었습니다.


(부가설명)

lea 명령으로 ebp-56 의 주소를 eax 에 저장합니다.

또, 바로 밑에 push를 해주고 fgets() 를 불러오는 것을 보면 buf의 시작은 ebp-56이라는것을 알 수 있겠죠 !


그리고


cmp(비교 명령어) 명령으로 ebp-16 부터 비교하는 것을 보면 check 이라는 변수는

ebp-16에 위치한다는 것을 알 수 있습니다.


그렇다면 공격 코드를 작성할때


"A"*40+"deadbeef" 로 작성해주면 될것같습니다.


여기서 deadbeef 는 그대로 보내면 안된다는거... ㅎ


이제 공격을 해보면 !!!



level15의 권한으로 쉘이 실행되는것을 확인할 수 있습니다 ! ㅎ 


level15의 password는 guess what 이네요 :)


이상 level 15 풀이를 마칩니다.






 

 






반응형