Description

Category: Reversing

Source: DEFCON CTF 2018 Quals.

Points: 102

Author: Jisoon Park(js00n.park)

Description:

pieces.tgz

Write-up

압축 파일을 풀어보면 broken이라는 바이너리 파일 하나와 8개의 dat 파일을 얻을 수 있다.

파이너리 파일을 실행해보면 바로 Segmentation Fault가 발생한다.

IDA로 열어보면 main() 함수와 그 위에 있는 f1(), f2(), f3(), recover_flag() 함수가 모두 'pop eax'로만 이루어져 있다. hex view로 살펴보면 파일의 해당 위치가 "X"라는 문자로만 채워져 있는 것을 볼 수 있는데, "X"를 의미하는 0x58을 disassembler가 'pop eax'로 인식한 것임을 알 수 있다.

이 부분을 dat 파일들로 적절히 채워 넣으면 될것 같다. 실제로 dat 파일들의 크기를 다 합치면 807 바이트로, broken 파일에 있는 "X"의 갯수와 동일하다.

이제 dat 파일들을 어떤 순서로 넣으면 좋을지 생각해보자. 친절하게도 정확히 f1() 함수의 시작 위치부터 main() 함수의 마지막 위치까지 비워져 있기 때문에, 첫 위치에 들어갈 파일은 함수의 prologue부터 시작해야 할테고 마지막으로 들어갈 파일은 ret로 끝나야 할 것이다.

이 조건에 맞는 파일은 다행히 각각 하나씩만 존재한다.

총 8개의 dat 파일 중에 2개의 위치는 알았으니, 나머지 6개의 위치를 특정해보자.

보통 이런 문제를 풀 때는 call이나 jmp instruction의 jump 주소를 참조하는 경우가 많지만, 이 경우이는 6가지 파일의 조합만 찾으면 되니 그냥 brute force 방식으로 조합을 시도해 보았다. (6! = 720가지 조합)

가능한 모든 조합에 대하여, 각 함수의 시작 주소에 prologue가 있는지 또는 시작 주소 바로 앞에 ret instruction이 있는지 확인해보면 될것 같다.

ret instruction을 확인하는 것을 조건으로 하여 모든 조합을 확인하였더니, 조건을 만족하는 한가지 조합이 발견되었고 그 조합을 그대로 실행하여 flag를 얻을 수 있었다.

Flag : welcOOOme

'writeups > Reversing' 카테고리의 다른 글

i can count  (0) 2019.11.26
Elementary  (0) 2019.11.26
Super Secure Vault  (0) 2019.11.26
Feed_me  (0) 2019.11.25
Snakes over cheese  (0) 2019.11.25

+ Recent posts