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 주소르 찾는다.
-> 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를 통해 계획한 대로 인자를 넘겨주고 메모리를 확인해보겠다.
(gdb 실행)
ebp를 확인하여 꺼내갈 ebp자리에 우리가 계획한 ebp가 잘 들어갔는지.
ret 주소에 leave-ret 주소가 잘 들어갔는지 체크한다.
ret 주소에 leave-ret 주소가 잘 들어갔는지 체크한다.
(fake ebp)
fake ebp, leave-ret 주소 확인
(버퍼)
fake ebp된 메모리 주소를 확인해보면 버퍼에 system 주소와 /bin/sh 문자열 주소가 잘 들어간 것을 확인할 수 있다.
공격
공격
(공격 실패)
당연히 실패할 줄 알았다.
바로
스택영역 주소는 0x10바이트 단위로 오차가 있을 수 있기 때문이다.
core 덤프파일을 확인하여 정확한 주소를 체크하자.
바로
스택영역 주소는 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 |