-
[LOB] Assassin -> Zombie_Assassin Write-up표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 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로 사용할 곳을
생각하면서 이용해야 한다는 것이다
다음단계로~
반응형'표튜터와 함께하는 Pwnable > The Lord Of the BOF Write-up' 카테고리의 다른 글
[LOB] Succubus -> Nightmare Write-up (0) 2019.03.19 [LOB] Zombie_Assassin -> Succbus Write-up (0) 2019.03.14 [LOB] Giant -> Assassin Write-up (0) 2019.03.04 [LOB] Bugbear -> Giant Write-up (0) 2019.03.03 [LOB] Darkknigth -> Bugbear Write-up (0) 2019.03.02 댓글