OutDoorFrog의 리버싱 이야기

Ajou OpenCTF 2018 WriteUp [Simple Reversing] 본문

공부/CTF 문제 풀이

Ajou OpenCTF 2018 WriteUp [Simple Reversing]

OutDoorFrog 2018. 9. 27. 17:58

블로그의 주인장 바깥 개구리 입니다.(개굴)




개굴에 대한 이미지 검색결과





심플 리버싱에 대해서 포스트를 시작하겠습니다.




1. Die 이용


Detect It Easy는 정적 분석에 사용하는 도구 중 하나입니다.


사용한 언어, 파일 패킹 여부, 사용한 컴파일러, 사용한 링커 등의 정보를 수집할 때 사용합니다.


리버싱 환경을 정하고 어떤 디버거를 사용할지 판단할 때 씁니다.


EntryPoint 값을 참고해서 Main 함수의 시작점이 어디일지 유추하기도 합니다.



사용 예시



PE 파일 -> 환경 : Windows, 디버거 : x32dbg, x64dbg, IDA


ELF 파일 -> 환경 : Linux, 디버거 : EDB, IDA






C언어로 작성했고 ImageBase값이 Default 입니다. 


메인 함수가 401000에 위치하고 있지 않을까 유추해봅시다.


2. 파일 실행




문제의 흐름을 유추하는 좋은 방법은 파일을 실행해보는 것입니다.



대부분 루틴에 대해서 알아내는 문제들은...



입력 -> 연산 -> 판단 -> 출력


이런 패턴으로 흘러가게 됩니다.





디버거를 사용해봅시다.



3. 트레이싱




EntryPoint : 1448 (ImageBase랑 안맞는 이유 : x64)







Main 함수 시작점 : 00001000





0x49, 0x6E, 0x70, 0x75, 0x20, 0x3A를 주기적으로 PUSH 합니다.

그리고 12E12B3 함수를 주기적으로 호출하는 군요.


HEX2ASCII : 'I', 'n', 'p', 'u', 't', ' ', ':'


"Input :" 문자열이라는 문자열을 출력해주는 것을 알 수 있습니다.





12EC0000 : %d

함수를 호출한 이후로 프로그램이 Running 상태로 변했습니다.

scanf, gets 함수일 확률이 높겠죠?


어찌했든 숫자를 받아주는 사실을 알았습니다.





특정한 주소에 0x04D2(1234)를 저장하는군요.






0x88221ad5, 0x155f92ab, 0x8c49e923, 0x784d461c 값들을 레지스터에 적재합니다.


적재한 후 값을 xor 해줍니다.
















그래서 나온 결과와 Input의 값을 XOR 연산한 후 값을 0x2f481326과 비교합니다.


input = 0x2f481326 ^ result


input = flag(Dec 형태)







네 결과가 나옵니다.




제가 따로 슈도코드 만들었습니다.

참고하시길 바랍니다^^

슈도 코드.txt



IDA로 아마 디스어셈블링이 안될겁니다.

기계어가 일부가 해석되지 않는 현상이 생기더군요.

질문 있으시면 댓글로 해주시면 됩니다.^^

Comments