动态调试常用工具x64dbg介绍:
- 反汇编窗口
- 寄存器窗口
- 内存窗口
- 堆栈窗口

基本调试操作

F2:设置断点
F4:运行到光标处
F7:单步步进(遇见call指令会进入函数内部)
F8:单步步过(执行call指令,但不进入函数内部)
F9:运行
F12:暂停
Ctrl+F9:运行到函数返回处,用于跳出函数(运行到ret指令处)
Alt+F9:运行到用户代码,用于跳出系统函数
Ctrl+G:跳转地址
空格:修改指令:

- G:查看流程图

- 搜索字符串

命令
- bp:设置断点
- [addr]:读取内存
- byte:[addr]:读取一个字节
一个例题

用ida反编译,然后搜索字符串,定位到具体函数,可以看到只有数字,大小写字母才能跳转到sub_4017F0函数(sub_4017B0会提示错误),并且被经过了处理,数字映射到0-9,小写字母映射到了10-35,大写字母映射到36-61。
然后在sub_4017F0里面:

将刚刚映射的数字作为aAbcdefghiabcde的下标,产生了另一长字符串Str1

最后和”KanXueCTF2019JustForhappy”对比。如果相等就进入到函数sub_401770,刚好就是pass。
本题可以反向将flag推出来,过程并不复杂。
也可以通过动态分析之间找出输入字符与最后比较的字符的映射关系。然后映射回去就ok了,相当于字母替换密码。
首先在strcmp之前设置断点,从ida里得到的地址是0x40185a,在x32dbg里面输入bp 0x40185a设置断点,然后运行并输入字符串,就可以看到处理后的映射结果,下图的ecx。

将数字,大小写字母全部输入一遍(分开输入,字符串长度有限),就得到了映射。

有了映射,答案就有了。