BOF 원정대의 zombie_assassin 잡기!

* 소스코드

(zombie_assassin.c)



zombie_assassin 특징
-> strcpy가 아니라 strncpy이다.
그렇기에 딱 48바이트만 strcpy 해준다. 즉 ret 주소까지만 복사시켜주기 때문에
이전에 풀었던 방법 ret 슬레이딩을 사용할 수 없다. 또 ret주소에 스택영역주소, 라이브러리 영역 주소를 넣을 수 없다.

그렇기에 여기서는 fake ebp를 사용해서 쉘을 획득할 것이다. leave-ret을 연속으로 2번 실행되게 할 수 있다면 fake ebp를 구성할 수 있다.
처음 leave에서는 우리가 설정한 ebp를 가져가게 되고 그 다음 leave에서 esp가 ebp로 옮겨가는 것이다.

우리에게 필요한 주소인 leave-ret을 실행시켜주게하기 위하여 leave-ret 주소르 찾는다.




(leave-ret 주소)



그 후 fake ebp 할 주소를 찾는다. 0xbffffa7c로 fake ebp를 잡게 되면 두 번째 leave할 때 esp가 이쪽으로 넘어오게 될것이다. 버퍼에서 일부러 4바이트 작은 주소로 잡았다. 그렇게 되면 그 다음 ret 때 버퍼 주소부터 잡아가기 때문이다.




(fake ebp 할 주소)


그러면 버퍼 앞에 system 주소와 /bin/sh 문자열을 인자를 넘겨주면 된다.

gdb를 통해 계획한 대로 인자를 넘겨주고 메모리를 확인해보겠다.



(gdb 실행)


ebp를 확인하여 꺼내갈 ebp자리에 우리가 계획한 ebp가 잘 들어갔는지.
ret 주소에 leave-ret 주소가 잘 들어갔는지 체크한다.




(fake ebp)



fake ebp, leave-ret 주소 확인


(버퍼)



fake ebp된 메모리 주소를 확인해보면 버퍼에 system 주소와 /bin/sh 문자열 주소가 잘 들어간 것을 확인할 수 있다.

공격


(공격 실패)



당연히 실패할 줄 알았다.
바로
스택영역 주소는 0x10바이트 단위로 오차가 있을 수 있기 때문이다.
core 덤프파일을 확인하여 정확한 주소를 체크하자.



(core 덤프 파일)



0x10 바이트 차이가 있었다.
다시 공격



(공격 성공)


쉘을 획득하였다. :)

'WarGame > 500 Project' 카테고리의 다른 글

(34/500) Lord of the BOF - nightmare  (0) 2017.06.23
(33/500) Lord of the BOF - succubus  (0) 2017.06.23
(31/500) Lord of the BOF - assassin  (0) 2017.06.23
(30/500) Lord of the BOF - giant  (0) 2017.06.21
(29/500) Lord of the BOF - bugbear  (0) 2017.06.20

+ Recent posts