OutDoorFrog의 리버싱 이야기
Ajou OpenCTF 2018 WriteUp [Simple Reversing] 본문
블로그의 주인장 바깥 개구리 입니다.(개굴)
심플 리버싱에 대해서 포스트를 시작하겠습니다.
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 형태)
네 결과가 나옵니다.
제가 따로 슈도코드 만들었습니다.
참고하시길 바랍니다^^
IDA로 아마 디스어셈블링이 안될겁니다.
기계어가 일부가 해석되지 않는 현상이 생기더군요.
질문 있으시면 댓글로 해주시면 됩니다.^^
'공부 > CTF 문제 풀이' 카테고리의 다른 글
Ajou OpenCTF 2018 WriteUp [gui montag] (0) | 2018.09.28 |
---|---|
Ajou OpenCTF 2018 WriteUp [Arm_Reversing] (3) | 2018.09.27 |
HackingCamp2018 CTF WriteUp(TheEnd) (3) | 2018.09.11 |
HackingCamp2018 CTF WriteUp(Yee.exe) (1) | 2018.09.08 |
HackingCamp2018 CTF WriteUp(ILoveRegistry) (2) | 2018.09.07 |