2016 EKOPARTY Fuckzing reverse
by St1tch
문제바이너리는 pwn의 Fuckzing exploit문제와 완전히 똑같다.
afl fuzzer의 컴파일러로 컴파일 된 리눅스 바이너리이다.
실행을 시키면 libget_flag.so 가 없다고 실행이 되지 않는다.

ldd명령어로 보면 libget_flag.so 를 찾을 수 없다고 적혀있다.

libget_flag.so파일을 임시로 만들고 그 공유라이브러리안에 get_flag함수를 위의 구조에맞게 대충 만들어주면 된다.

나는 대충 이런 코드를 so파일로 만들었다.
gcc -fpic -shared get_flag.c -o libget_flag.so
를 이용해서 so파일을 만든 후
/usr/lib/x86_64-linux-gun/ 디렉토리에 임시로 복사해놓으면 에러가 발생하지 않는다.

그래프뷰를 보면 엄청 복잡해보이지만 규칙적인 구조로 되어있다.
입력받은 값의 각 글자에 대해 간단한 연산을 한 후 비교하는 그런 부분이 엄청 많은거 뿐이다.
사용자 입력은 300바이트를 read함수를 통해 받는다.
문제를 풀어보면 이 300바이트 중에 100바이트만 키값을 비교하는데 사용되고
나머지는 pwn문제에서 페이로드로 사용이 된다.
대회때는 세화가 바이너리를 수정해서 신선한 방법으로 문제를 풀었다
angr로 시도 해보니 angr로도 금방 풀리는문제였다. ㄷㄷ
avoid_list만 잘 해주면 빨리 답이나오는 그런문제였다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import angr | |
def avoid_list() : | |
#avoid_list -> objdump -S ./FUck_binary | grep jmp | |
f = open('avoid_list', 'r').read().split('\n') | |
avoid_list_ = [] | |
for i in f : | |
if 'main+' in i : | |
avoid_list_.append(int(i.split()[4], 16)) | |
return tuple(avoid_list_) | |
def solver() : | |
p = angr.Project('FUck_binary') | |
pg = p.factory.path_group() | |
e = pg.explore(find=0x4039e4, avoid=avoid_list()) | |
find = e.found[0].state.posix.dumps(0) | |
print find | |
open('key', 'wb').write(find) | |
if __name__ == '__main__' : | |
solver() |
블로그의 정보
튜기's blogg(st1tch)
St1tch