一、准备阶段
打开IDA
将boob拖入IDA
F5进入伪代码
二、代码调试
第一题
双击phase_1进入函数
显然第一题答案为
I am not part of the problem. I am a Republican.
第二题
双击phase_2进入函数
显然这里会输入六个数字,且第一个为1,其后的数字为前一个数字的两倍,故答案为
1 2 4 8 16 32
第三题
双击phase_3进入函数
那这里又显而易见了,答案为以下任意一组
第一个数 | 第二个数 | 第三个数 |
---|---|---|
0 | 109 | 450 |
1 | 121 | 514 |
2 | 106 | 970 |
3 | 121 | 823 |
4 | 116 | 800 |
5 | 117 | 575 |
6 | 108 | 655 |
7 | 98 | 855 |
第四题
双击phase_4进入函数
显然这里要求第一个参数范围0~14,然后调用func4,并要求返回值和第二个参数均为21
双击func4进入函数
经过运算可以知道最终答案为
7 21
第五题
双击phase_5进入函数
这里要求输入六个字符,且对每一个字符取其后四位作为数组的索引,并将其组合后需要变成“bruins”
双击array_2961进入数组
因此加工的索引值排序为“d63487”,故答案为(例如d的十进制是13,于是‘a’+13-1就为‘m’)
mfcdhg
第六题
双击phase_6进入函数
输入6个不大于6的数字且要求不相同,然后用输入的索引值对链表元素检验是否进行从小到大的排序,
双击node1进入链表
点击对应的node单击h可以转换为十进制
故答案为
5 3 4 2 1 6
第七题
在方法区找到phase_defused,单击进入
可以看见需要在第四题答案后加上字符串“DrEvil”
至于为啥是第四题可以查看phase_defused中的byte_804B5D0栈空间位置
另外在read_line中可以看见
输入缓存区是以每道题80字节增长的,且起始地址如图
可以知道的是在第四题的时候刚好到达phase_defused中sscanf的指定读取位置
双击secret_phase进入函数
将输入的字符串转化为数字,并调用fun7,并要求返回4
双击fun7进入函数
返回上一函数,单击n1进入链表
显然这里应该是
7