
# 악성코드 분석용 radare2 스크립트 모음: 메모리 덤프에서 바이너리 추출, PE 헤더 패치, 셸코드 내 해시 함수 임포트 디코딩
radare2와 함께 사용하기 위한 스크립트 '모음집'입니다.
이 스크립트는 오프셋과 크기가 주어지면 메모리 덤프(MDMP)에서 파일을 추출합니다. 추출 외에도 추출된 PE 파일에 대한 기본 패치도 지원합니다. 이 글을 작성하는 시점 기준으로 PE 섹션 헤더 내의 오프셋을 패치합니다.
요구 사항
pip install r2pipe
기본 인자를 사용한 샘플 출력:
예제
$ python2 ./r2_bin_carver.py ./memory.dmp 0x04af0000 0x2f000
[+] Carving to ./memory.dmp.0x04af0000
매직 체크 및 패치를 사용한 바이너리 추출 샘플 출력:
$ python2 ./r2_bin_carver.py -p -b MZ ./memory.dmp 0x04af0000 0x2f000
[+] Checking for magic: MZ - 4d5a
[+] Magic found, carving...
[+] Carving to ./memory.dmp.0x04af0000
[+] Patching...
[+] Found 3 sections to patch
[+] Patching Section 0.
Setting VirtualSize to 0x1fb0
Setting PointerToRawData to 0x1000
[+] Patching Section 1.
Setting VirtualSize to 0x5b7f
Setting PointerToRawData to 0x3000
[+] Patching Section 2.
Setting VirtualSize to 0x254d2
Setting PointerToRawData to 0x9000
[+] Pathing done
이 스크립트는 사전 생성된 해시 데이터베이스를 조회하여 함수 해시를 디코딩합니다. 지원되는 해싱 기법에 대한 생성, 검색 및 분석을 처리합니다.
요구 사항
pip install pefile r2pipe sqlite3
지원 기법
현재 지원되는 해싱 기법입니다.
$ python2 ./r2_hash_func_decoder.py -l
Suported Hashing Techniques:
- doublepulsar
- metasploit
데이터베이스 생성
이 명령은 지원되는 모든 해싱 기법에 대해 DLL 또는 EXE의 모든 내보내기 함수에 대한 해시를 생성합니다.
$ python2 ./r2_hash_func_decoder.py -g ntdll.dll
Generating Hashes:
Processing ./ntdll.dll...
데이터베이스 검색
주어진 해시에 대해 데이터베이스를 수동으로 검색합니다.
$ python2 ./r2_hash_func_decoder.py -s 0x6f721347
Searching for 0x6F721347...
- metasploit: ntdll.dll!RtlExitUserThread()
radare2에서 자동 분석
이 명령은 주어진 기법에 대해 디코딩할 해시를 찾기 위해 radare2 내의 모든 정의된 함수를 검색합니다.
$ r2 shellcode
> af @ 0x0
> afl
0x00000000 31 931 fcn.00000000
> #!pipe python2 ./r2_hash_func_decoder.py -a doublepulsar
Analysing:
Function: fcn.00000000 0x0 931
|_ 0x0000001f movabs rcx, 0x3e1481df ntoskrnl.exe!PsLookupProcessByProcessId
|_ 0x0000003e movabs rcx, 0xa0031eba ntoskrnl.exe!PsGetProcessImageFileName
|_ 0x0000005d movabs rcx, 0xfffffffff9e70684 ntoskrnl.exe!KeStackAttachProcess
|_ 0x0000007c movabs rcx, 0x15ebfe4f ntoskrnl.exe!PsGetProcessPeb
|_ 0x0000009b movabs rcx, 0xa4ac30f9 ntoskrnl.exe!KeUnstackDetachProcess
|_ 0x000000ba movabs rcx, 0xecd0beca ntoskrnl.exe!ObfDereferenceObject
|_ 0x000000d9 movabs rcx, 0xffffffff5d9fb8ae ntdll.dll!ZwAllocateVirtualMemory
|_ 0x000000f8 movabs rcx, 0xffffffffe3690194 ntoskrnl.exe!ExAllocatePool
|_ 0x00000117 movabs rcx, 0xffffffffb80010f6 ntoskrnl.exe!KeInitializeApc
|_ 0x00000136 movabs rcx, 0xffffffffd25fd6ca ntoskrnl.exe!KeInsertQueueApc
|_ 0x00000155 movabs rcx, 0x1124a879 ntoskrnl.exe!KeGetCurrentThread
|_ 0x00000174 movabs rcx, 0x4f90c637 ntoskrnl.exe!PsGetCurrentProcess
|_ 0x00000193 movabs rcx, 0x10fee76c ntoskrnl.exe!PsGetThreadTeb
위 기능 외에도 해당 줄에 주석을 추가합니다:
[snip]
0x00000017 e8bc060000 call 0x6d8 ;[1]
│ 0x0000001c 4889c3 mov rbx, rax
│ 0x0000001f 48b9df81143e. movabs rcx, 0x3e1481df ; ntoskrnl.exe!PsLookupProcessByProcessId
│ 0x00000029 e826050000 call 0x554 ;[2]
│ 0x0000002e 4885c0 test rax, rax
│ ┌─< 0x00000031 0f8455030000 je 0x38c ;[3]
│ │ 0x00000037 4889059c0700. mov qword [0x000007da], rax ; [0x7da:8]=0
│ │ 0x0000003e 48b9ba1e03a0. movabs rcx, 0xa0031eba ; ntoskrnl.exe!PsGetProcessImageFileName
│ │ 0x00000048 e807050000 call 0x554 ;[2]
│ │ 0x0000004d 4885c0 test rax, rax
│ ┌──< 0x00000050 0f8436030000 je 0x38c ;[3]
│ ││ 0x00000056 488905850700. mov qword [0x000007e2], rax ; [0x7e2:8]=0
│ ││ 0x0000005d 48b98406e7f9. movabs rcx, 0xfffffffff9e70684 ; ntoskrnl.exe!KeStackAttachProcess
│ ││ 0x00000067 e8e8040000 call 0x554 ;[2]
[snip]