표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up

[LOB] Assassin -> Zombie_Assassin Write-up

IMyoungho 2019. 3. 5. 03:47

혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.



이번 문제를 풀기위해서는 이전 문제와는 비슷하지만 새로운 개념이 필요하다!!

우선 코드를 보자!

이전의 문제와 거의 같으나 이번에는 입력되는 값을 버퍼에 저장할 때

길이 제한이 걸려있다. 또한 힌트로 주어진 것은 바로 FEBP이다.

FEBP는 Fake ebp를 의미하는데 이번에는 ret gadget뿐만아니라 leave gadget도 이용해야한다.


Fake ebp의 원리는 그림과 같다.

sfp에 &buffer-4값을 넣어주고

ret에는 leave gadget주소를 넣어준다.

버퍼에는 쉘코드 주소와 nop으로 채워준다.


그렇게되면 에필로그 진행 시 공격이 시작되며

(1)leave gadget 진행 시,

(2)[pop ebp]가 진행되면서 pop으로 인해 esp가 +4되고 

(2)ebp는 sfp에 저장된 주소를 따라 &buffer - 4의 주소값을 가지게된다.


다음으로 ret gadget을 진행하게되면

[ pop eip]가 진행되면서 (2)esp+4 되었던 주소값이 (2)eip로 저장되고 (3)esp값은 한더 +4 된다.

[ jmp eip]로 인하여 (2)eip 주소값으로 가서 실행되는데 그림에서 볼 수 있듯이

해당 주소는 leave gadget이므로 다시한번 leave gadget 진행된다.


leave gadget이 진행되면서

(4)[ mov esp, ebp ]로 인해 esp와 ebp 둘다 &buffer-4의 주소값을 가지게 되고

(5)[pop ebp]로 인하여 esp는 +4 된다. 또한 ebp는 dummy 값을 가지게 된다.

(ebp 값은 &buffer-4가 가지고 있던 dummy 값)


다음으로 ret gadget이 진행되면서

(6)[ pop eip ]로 (5)esp+4의 값 즉, buffer의 시작주소값이 (6)eip에 저장되고 (7)esp는 한번 더 +4된다.

(6)[ jmp eip ]로 인하여 buffer부터 실행이 되는데

우리는 버퍼의 시작주소에 shellcode를 넣어놓을 것임으로

shellcode가 실행되어 쉘이 따지게된다.

(sfp까지의 남은 버퍼의 크기는 nop으로 채워놓는다)



이러한 모양으로 Fake ebp가 진행될 것이다.

첫 번째 fake ebp로 인해 leave gadget 실행 시 ebp가 fake ebp2로 옮겨질 것이고

두 번째 에필로그에서 fake ebp2를 ebp에 넣고 esp가 + 4인 a를 리턴하여 실행할 것이다.

이와 같은 작업으로 fake ebp3를 ebp에 넣고 b를 리턴하여 실행하게되는 원리로

이번 공격을 진행하면 된다.



이제 공격에 필요한 것들을 하나씩 구해보자

이전 문제와 마찬가지로 두 가지 방식으로 풀 수 있다.



* 풀이1. System 함수 이용 * 


leave gadget은 쉽게 구할 수 있었다. 0x80484df



buffer에 "a"*40개 sfp에 "bbbb" ret에 "cccc"를 넣어주었다.

"a"가 시작되는 파란색상자가 buffer의 시작이므로 빨간상자부분이 &buffer-4의 값이다.

그러므로 &buffer-4 = 0xbffffa7c


마지막으로 "/bin/sh"과 system함수주소는 이전문제들에서 많이 구했기 때문에 생략한다.

system 함수 주소 = 0x40058ae0

"/bin/sh"의 주소 = 0x400fbff9


우리는 더 이상의 fake ebp는 필요없으므로 다음 fake ebp를 일으킬 수 있는 자리에 "aaaa"를 넣어주었다.


Payload = "aaaa" + System함수 + dummy(4) + "/bin/sh"주소 + nop(24) + buffer주소-4 + leave gadget주소

세그멘테이션 폴트가 일어나서 core파일을 보기로 했다.



우리가 다음 fake ebp를 일으킬 수 있는자리에 넣어놓은 aaaa가 보인다.

그러므로 fake ebp자리에 0xbffffa7c가 아닌 0xbffffa80을 넣어주면된다!

0xbffffa80을 넣어주면 esp가 esp+4를 가리키기 때문에 0x40058ae0부터 실행될 것이다.





쉘이 따졌다~~




* 풀이2. Shellcode 이용 * 


이용한 Shellcode(25Byte)

 "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53

\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"



Payload = Shellcode주소 + Shellcode + nop * 11 + shellcode주소가 있는 주소 + leave gadget

우선 nop을 주어서 buffer의 시작주소를 찾아보았다.



쉘코드의 시작주소는 0xbffffa84이기 때문에 nop*4대신 0xbfffffa84를 넣어주고

이 쉘코드를 실행시키기위해 fake ebp값은 0xbfffffa7c를 넣어주면 

leave gadget이 한 번더 진행될 때 leave로 인해 esp+4가 진행되고

ret gadget으로 인하여 쉘코드 주소부터 실행되어 깔끔하게 쉘이 따질 것이다.


쉘이 따졌다~




이 문제를 풀면서 알 수 있었던 것은 FEBP는 무조건적으로 &buffer-4를 주는 것이 

고정된 절차가 아니라 메모리를 보면서 자신이 Fake ebp로 사용할 곳을

 생각하면서 이용해야 한다는 것이다


다음단계로~




반응형