해킹/Write Up

Codegate 2017 prequals RamG-thunder Write Up

NextLine 2017. 3. 11. 22:29

0. Introduce

리버싱문제는 한번도 풀어본적이 없는데 Codegate에서 이 Ramg-thunder문제를 풀어보려고 계속 삽질하다가 결국에 풀었습니다.. 도중에 binaryninja, ida, ollydbg이 세개를 써보았는데 저는 binaryninja에 debugging기능이 있으면 ida보다는 그걸 썻겠지만 역시 ida가 제일좋네요. 리버싱문제에도 자신감이 생길 수 있도록 해준 문제인 것 같습니다. (확실히 window binary는 window 노트북에서 하는게 편하네요)


1. Binary

구성은 간단한 xor 프로그램인것 같은데 4번의 히든메뉴가 존재하는 프로그램 이였다.

그래서 아무값이나 넣어보니 바탕화면에 c라는 새로운 바이너리가 생성되었다. 그래서 stage마다 올바른값을 입력하면 올바른 바이너리가 생성될 것이라고 예상했다.


2. Solve

- stage 1

코드를 해석해보면 입력값을 특정값과 xor한뒤에 (sub_b14c20은 비교하는 함수인것으로 보임) MVYLXYUARJ라는 값과 맞는지 비교하는 검사문이 있다. 여기서 조금 삽질을하면 47459와 xor을 한다는것을 알 수 있지만, xor을 두번하면 같은값이 된다는점을 이용해 MVYLXYUARJ을 특정값과 xor시켜서 프로그램 내부에 사용자 입력값을 확인해보면 yamyambugs인것을 확인할 수 있다. 그렇기때문에 stage1에서 원하는 입력값은 yamyambugs인것을 확인할 수 있다.


- stage 1 ~ stage 2

그리고 stage2를 갈때 안티디버깅이있다. 그냥 eip를 stage2로 넘겨버렸다.


- stage 2

코드해석을 해보면 ebx+194~196과 특정값을 비교한다. 그렇기에 그냥 ebx+194, ebx+195, ebx+196을 비교하는 특정값으로 수정해주었다.


- stage 3

코드해석을 해보면 특정 함수를 실행시키고 그 함수의 리턴값이 0일경우에 프로그램이 제대로 동작할것 같다.

그래서 그냥 함수들의 리턴값을 0으로 맞춰주었다.


- stage 4

stage4는 stage2랑 비슷하다. 하지만 안티디버깅루틴이 있으므로 위에서 했던방식 그대로 메모리값 수정 + eip 수정을 해서 넘어가준다.


- stage 5

이부분은 stage1과 비슷하다. 마찬가지로 [S[X]DWYJ^를 넣어서 xor을 돌리고 xor된 입력값을 확인해보면 hellowfish인것을 확인할 수 있다. 그러므로 hellowfish를 넣어주면된다.


- fisish

그리고 마지막 부분에 이런 루틴들이있는데 아마 지금까지 입력한 값을 기반으로 바이너리파일을 만드는 과정인것 같다. 그냥 넘겨주었다.


그러면 다음처럼 c 파일이 생성된다.


시그니처를 확인해보면 png파일인것을 알 수 있고, 확장자를 png로 바꾸고 실행해보면 flag를 얻을 수 있다.


FLAG : ThANk_yOu_my_PeOP1E