有时程序会有大量混淆代码,IDA无法识别关键逻辑。之前对某程序采用IDA的tracing或x64dbg的Animate into进行追踪,都遭遇了记录不完整的后果。不清楚是不是因为混淆代码太多致使生成的trace文件超过限制了,后来改用x64dbg的trace into进行追踪获得了成功,下面把追踪时的步骤及其注意要点列出来。
1. 选择一个断点,程序运行至此。
2. 选择Trace菜单,然后选择Trace into...(Ctrl+Alt+F7)。在新创建的窗口中分别设置Log Text、Maximum trace count(尽量设置最大,如999999999)、追踪日志文件。
可以将Log Text设置位0x{p:cip} {i:cip}将数据记录到文件中,最终获得诸如以下形式的记录:
0x006E8749 mov ebp, esp
上述记录缺乏寄存器的信息,实际应用中可借鉴的意义不大。
为了得到更多信息,最好将Log Text设置为
如果为32位程序,写成如下的样子
0x{p:cip} {i:cip} eax:{eax}; ebx:{ebx}; ecx:{ecx}; edx:{edx};ebp:{ebp}; esp:{esp}; esi:{esi}; edi:{edi}
如果为64位程序,写成如下的样子
0x{p:cip} {i:cip} rax:{rax}; rbx:{rbx}; rcx:{rcx}; rdx:{rdx};rbp:{rbp}; rsp:{rsp}; rsi:{rsi}; rdi:{rdi}; r8:{r8}; r9:{r9}; r10:{r10}
3. 按F9运行,此时就会生成trace日志了。
4. 生成的trace日志里有大量的系统调用,这些并需要我们分析,可以删除,减少分析工作量。可借助RegexBuddy写正则表达式,例如,用EmEditor将所有包含^0x00007FF[0-9A-F]{9}的行设置为书签行,然后删除书签行
5. 借助于EmEditor,将包含给定模式的混淆指令的代码行标识出来(譬如,以书签行的形式),然后删除书签行,此时就完成了代码清洗,凸显出核心代码。此时可以加以调试分析了。
这种方法比写代码去除混淆指令要方便、省事。即便发现操作有误,删除了少部分关键代码,也可以对照原始trace日志恢复出来。
6. 举例
看雪2021KCTF春季赛\第六题 寻回宝剑
采用该法,分别生成了如下日志文件
KCTF_长度不对.log
KCTF_长度相等.log
KCTF_长度范围符合.log
KCTF_长度范围符合增序.log
KCTF_长度范围增序不重复.log
获得不同分支的有效指令
网友评论