Reversing.kr Easy Unpack Writeup Using Ghidra

Reversing.kr Easy Unpack은 OEP (Original Entry Point)를 찾는 문제입니다.
OEP의 가능성이있는 Far Jump를 추출하는 Ghidra Script를 작성했으므로 Ghidra 연구의 기록으로 남겨 둡니다.

문제 배포 사이트

Easy Unpack은 EXE와 텍스트 파일을 전달하며 텍스트 파일에는
Find the OEP
ex) 00401000
라고 기재되어 있다.

우선, IDA free
Graph overview로 아래쪽으로 이동


Graph view의 마지막 쪽에 있는 점프처를 몇개인가 입력하면 정답이었다.


여기에서 본제

OEP는 VirtualAlloc 등으로 새롭게 할당할 수 있었던 메모리 공간에 있으므로 멀리 jump 해야 한다.
멀리 점프할 때 jump to any absolute address 가 될 것.
Ghidra에서 Script를 짜서 Far Jump를 자동으로 찾는 것에 도전.

참고 사이트:핑크 선생님의 Ghidra Script 두는 장소

Ghidra API

Far Jump 추출하기 Ghidra Script

far_jmp_search.py
from ghidra.program.model.listing import CodeUnit

jump_count = 0

#get all memory ranges
addr_ranges = currentProgram.getMemory().getAddressRanges()

for addr_range in addr_ranges:
    insts = currentProgram.getListing().getInstructions(addr_range.getMinAddress(), True)
    for inst in insts:
        flow_type = inst.getFlowType()
        if flow_type.isJump():            
            len = inst.getDefaultFallThroughOffset()
            # Exclude near jumps
            if len > 2:
                print("{} {} {}".format(inst.address, inst, len))
                jump_count += 1

print('far jump count: {}'.format(jump_count))

결과

좋은 웹페이지 즐겨찾기