개요
x64dbg를 이용하여 악성코드를 분석하는데, JMP문을 반복적으로 사용하여 분석에 난항을 겪었다.
명령어를 실행할 때마다 해당 명령어를 일일히 손으로 기록할 수는 없었다.
이 작업을 자동화할 방법이 필요했고 x64dbgpy를 사용하게 되었다.
문제 해결
asm.txt 라는 파일을 생성하여 EIP 레지스터의 값이 0x238240이 될 때까지 작업을 반복하는 코드를 작성했다.
DISASM_INSTR 클래스로 객체를 생성한 후, DbgDisasmAt 함수를 호출하여 디스어셈블한 내용을 파일에 저장한다.
try:
from x64dbgpy import *
f = open("C:\\Users\\forgotten\\Desktop\\asm.txt", "w")
while pluginsdk.GetEIP() != 0x238240:
c_eip = pluginsdk.GetEIP()
ins = pluginsdk.x64dbg.DISASM_INSTR()
pluginsdk.x64dbg.DbgDisasmAt(c_eip,ins)
f.write(ins.instruction + "\n")
pluginsdk.StepOver()
f.close()
except:
print("except!")
결과를 보면 쓸데없이 jmp 명령어가 차지하는 비중이 크다는 느낌을 받을 것이다.
jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB jmp 0x002380EE jmp 0x00238201 add ecx, 0x554E0F85 jmp 0x0023812D jmp 0x002381C3 xor dword ptr ds:[edx], ecx jmp 0x00238010 jmp 0x002380C7 add edx, 0x4 nop jmp 0x002380D1 jmp 0x002380D5 jmp 0x00238117 jmp 0x00238238 |
jmp 명령어를 필터링하면 어떤 연산을 하고 있는지 좀 더 편하게 확인할 수 있다.
(edx가 가르키는 주소를 ecx 레지스터를 이용하여 반복적으로 xor 연산해주고 있다.)
jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB add ecx, 0x554E0F85 xor dword ptr ds:[edx], ecx add edx, 0x4 nop cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB add ecx, 0x554E0F85 xor dword ptr ds:[edx], ecx add edx, 0x4 nop cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB add ecx, 0x554E0F85 xor dword ptr ds:[edx], ecx add edx, 0x4 nop cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB add ecx, 0x554E0F85 xor dword ptr ds:[edx], ecx add edx, 0x4 nop cmp edx, ebp jb 0x00238069 imul ecx, ecx, 0x2B275ABB imul ecx, ecx, 0x2B275ABB add ecx, 0x554E0F85 xor dword ptr ds:[edx], ecx add edx, 0x4 nop cmp edx, ebp jb 0x00238069 |
참조
github.com/schlafwandler/x64dbgpy_cheat_sheet
forum.tuts4you.com/topic/39577-dbgdisasmat-other-method/
blog.attify.com/flare-on-5-writeup-part6/
'Reversing' 카테고리의 다른 글
thiscall 마이크로소프트 설명 (0) | 2021.06.26 |
---|---|
xdbg 및 x64dbgpy 설치 및 실행 (0) | 2021.01.04 |