IDAPython을 이용한 데이터 패칭
_printf 함수 인자 값 전달 전 EAX 레지스터에 저장된 데이터 주소를 확인하여 해당 주소에 데이터를 xor 패치 후 _printf 함수를 호출하는 간단한 IDAPython 코드이다.
def DecodeKey(eax):
for n in range(0, 5):
print "target: ", chr(Byte(eax + n)) # 수정될 문자
PatchByte(eax + n, Byte(eax + n)^0x33) # xor 연산
print "patch: ", chr(Byte(eax + n)) # 수정 후 결과
def BreakManager(startPoint, targetPoint):
AddBpt(startPoint) # 패치 수행할 위치
afterFunc = idc.NextHead(targetPoint)
AddBpt(afterFunc) # _printf 수행 후 위치
findCode = "89 44 24 04" # mov [esp+4], eax
targetFunc = "_printf" # 패치한 결과를 전달할 목표 함수
startPoint = MinEA()
while True:
startPoint = idc.FindBinary(startPoint, SEARCH_DOWN|SEARCH_NEXT, findCode) # 코드 검색
if startPoint == idc.BADADDR:
break
else:
targetPoint = startPoint
for ni in range(0,2):
targetPoint = idc.NextHead(targetPoint)
if targetFunc == idc.GetOpnd(targetPoint, 0): # 검색된 코드가 _printf 함수 인자인지 확인
BreakManager(startPoint, targetPoint) # 브레이크 포인트 설정
RunTo(startPoint) # 프로세스 수행 (_printf 실행 전)
print "param : ", hex(startPoint), idc.GetDisasm(startPoint)
print "func : ", hex(nextPoint), idc.GetDisasm(nextPoint)
GetDebuggerEvent(WFNE_SUSP|WFNE_CONT, 10)
eax = GetRegValue("EAX") # eax 레지스터 값 불러오기
DecodeKey(eax) # 데이터 패치
RunTo(startPoint) # 프로세스 수행 (_printf 실행)