IDA Pro 静态调试
- 字符串搜索:Alt+T
- 搜索下一个:Ctrl+T
- 反汇编为C代码:F5
- 修改命令:ALT+F2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31a:将数据转换为字符串
f5:一键反汇编
esc:回退键,能够倒回上一部操作的视图(只有在反汇编窗口才是这个作用,如果是在其他窗口按下esc,会关闭该窗口)
shift+f12:可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
ctrl+w:保存ida数据库
ctrl+s:选择某个数据段,直接进行跳转
ctrl+鼠标滚轮:能够调节流程视图的大小
x:对着某个函数、变量按该快捷键,可以查看它的交叉引用
g:直接跳转到某个地址
n:更改变量的名称
y:更改变量的类型
/ :在反编译后伪代码的界面中写下注释
\:在反编译后伪代码的界面中隐藏/显示变量和函数的类型描述,有时候变量特别多的时候隐藏掉类型描述看起来会轻松很多
;:在反汇编后的界面中写下注释
ctrl+shift+w:拍摄IDA快照
u:undefine,取消定义函数、代码、数据的定义
解除passwd的限制
- 执行程序发现程序会打印提示信息 “What’s your password?”,于是在反汇编代码中搜索password字样可找到程序的主流程地址9.29.1
- 可以看到puts和scanf等字样,不难理解其为输入输出指令
- 在63和78行可以看到j_strcmp猜测是做字符串比对
- 6D和82行通过比对结果来判断是否跳转,如果没有跳转则往下执行会输出Wrong
- 所以可以猜测密码为
--diangroup707--
或者you_shall_no_pass
- 将汇编代码转换为C代码也可验证我们的猜想9.29.2
解密过程
- 上一步密码正确后跳转到
loc_41419F
loc_41419F
获取到输入的code(以%d读取)后跳转到sub_4111A4
再跳转到sub_413FA0
sub_413FA0
做数据初始化,具体的数据看汇编比较难读懂,转成C更容易分析loc_414029
for循环条件loc_414051
文件存储,可以看出该程序创建了一个名为kp的文件在D盘9.29.3- 打开文件发现都是乱码,回头将程序转为C语言查看发现是很麻烦的移位+取异或操作,也难怪汇编代码难看懂……9.29.4
问题回答
- 解密函数调用了文件操作的一系列API(CreateFile、WriteFile、CloseHandle)
- 参数是如何传递的
- 在汇编中参数传递有两种方式:lea传值和使用内存存储
- 在此程序中将参数扩展后存储在eax通用寄存器中,子程序通过读取AL来获取到参数
- 谁来清理堆栈
- 清理堆栈通过push ebp和mov ebp,sep两条指令来完成
- 在此程序中很多个子程序都会清理堆栈
尝试修改源码
- 对于源码来说改容易,添加不容易,因为添加需要扩展段的空间
- 尝试将原来的输出Wrong改为跳转到密码正确的程序部分
- 但暂时还不会重新打包,新人任务Week2中有关于打补丁的内容,这次就不纠结于这个问题了
x32dbg 动态调试
可参考逆向工程核心原理
- 依旧是使用字符串搜索password可定位到main函数部分

9.27.3
- 可继续使用单步调试走完整个流程,大部分代码与静态分析相似
- CTRL+G 转到指定位置
- CTRL+E 编辑数据
- 源码修改即修改指令后打补丁到一个新的exe即可

9.29