MASTG-TECH-0097: 运行时逆向工程
运行时逆向工程可以看作是逆向工程的“即时”版本,在这种情况下,您无需将二进制数据传输到您的主机。相反,您将直接从应用程序的内存中分析它。
我们将继续使用 iGoat-Swift 应用程序,使用 r2frida r2 frida://usb//iGoat-Swift
启动一个会话,您可以通过使用 :i
命令来显示目标二进制文件的信息。
[0x00000000]> :i
arch arm
bits 64
os darwin
pid 2166
uid 501
objc true
runtime V8
java false
cylang true
pageSize 16384
pointerSize 8
codeSigningPolicy optional
isDebuggerAttached false
cwd /
使用 :is <lib>
搜索某个模块的所有符号,例如:is libboringssl.dylib
。
以下操作会不区分大小写搜索(grep)包含“aes”的符号(~+aes
)。
[0x00000000]> :is libboringssl.dylib~+aes
0x1863d6ed8 s EVP_aes_128_cbc
0x1863d6ee4 s EVP_aes_192_cbc
0x1863d6ef0 s EVP_aes_256_cbc
0x1863d6f14 s EVP_has_aes_hardware
0x1863d6f1c s aes_init_key
0x1863d728c s aes_cipher
0x0 u ccaes_cbc_decrypt_mode
0x0 u ccaes_cbc_encrypt_mode
...
或者您可能更喜欢查看导入/导出。例如
- 列出主二进制文件的所有导入:
:ii iGoat-Swift
。 - 列出 libc++.1.dylib 库的导出:
:iE /usr/lib/libc++.1.dylib
。
对于大型二进制文件,建议通过追加
~..
将输出管道传输到内部 less 程序,即:ii iGoat-Swift~..
(否则,对于此二进制文件,您将获得几乎 5000 行打印到您的终端)。
接下来您可能想要查看的是类
[0x00000000]> :ic~+passcode
PSPasscodeField
_UITextFieldPasscodeCutoutBackground
UIPasscodeField
PasscodeFieldCell
...
列出类字段
[0x19687256c]> :ic UIPasscodeField
0x000000018eec6680 - becomeFirstResponder
0x000000018eec5d78 - appendString:
0x000000018eec6650 - canBecomeFirstResponder
0x000000018eec6700 - isFirstResponder
0x000000018eec6a60 - hitTest:forEvent:
0x000000018eec5384 - setKeyboardType:
0x000000018eec5c8c - setStringValue:
0x000000018eec5c64 - stringValue
...
假设您对 0x000000018eec5c8c - setStringValue:
感兴趣。您可以使用 s 0x000000018eec5c8c
寻址到该地址,分析该函数 af
并打印其反汇编的 10 行 pd 10
[0x18eec5c8c]> pd 10
╭ (fcn) fcn.18eec5c8c 35
│ fcn.18eec5c8c (int32_t arg1, int32_t arg3);
│ bp: 0 (vars 0, args 0)
│ sp: 0 (vars 0, args 0)
│ rg: 2 (vars 0, args 2)
│ 0x18eec5c8c f657bd not byte [rdi - 0x43] ; arg1
│ 0x18eec5c8f a9f44f01a9 test eax, 0xa9014ff4
│ 0x18eec5c94 fd std
│ ╭─< 0x18eec5c95 7b02 jnp 0x18eec5c99
│ │ 0x18eec5c97 a9fd830091 test eax, 0x910083fd
│ 0x18eec5c9c f30300 add eax, dword [rax]
│ 0x18eec5c9f aa stosb byte [rdi], al
│ ╭─< 0x18eec5ca0 e003 loopne 0x18eec5ca5
│ │ 0x18eec5ca2 02aa9b494197 add ch, byte [rdx - 0x68beb665] ; arg3
╰ 0x18eec5ca8 f4 hlt
最后,您可能希望从某个二进制文件中检索字符串并对其进行过滤,而不是对字符串进行完整的内存搜索,就像您使用 radare2 离线一样。为此,您必须找到二进制文件,寻址到它,然后运行 :iz
命令。
建议使用关键字
~<keyword>
/~+<keyword>
应用过滤器,以最大限度地减少终端输出。 如果只想浏览所有结果,您也可以将它们管道传输到内部 less:iz~..
。
[0x00000000]> :il~iGoa
0x00000001006b8000 iGoat-Swift
[0x00000000]> s 0x00000001006b8000
[0x1006b8000]> :iz
Reading 2.390625MB ...
Do you want to print 8568 lines? (y/N) N
[0x1006b8000]> :iz~+hill
Reading 2.390625MB ...
[0x1006b8000]> :iz~+pass
Reading 2.390625MB ...
0x00000001006b93ed "passwordTextField"
0x00000001006bb11a "11iGoat_Swift20KeychainPasswordItemV0C5ErrorO"
0x00000001006bb164 "unexpectedPasswordData"
0x00000001006d3f62 "Error reading password from keychain - "
0x00000001006d40f2 "Incorrect Password"
0x00000001006d4112 "Enter the correct password"
0x00000001006d4632 "T@"UITextField",N,W,VpasswordField"
0x00000001006d46f2 "CREATE TABLE IF NOT EXISTS creds (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT);"
0x00000001006d4792 "INSERT INTO creds(username, password) VALUES(?, ?)"
要了解更多信息,请参阅 r2frida wiki。