题目网址
一句话概括:
然后一行行输入分析程序得出的结果。
免费版就有 decompile 功能。
或者 ida7.0 pro + wine + wineprefix 64 bit
一
code
二
逆向的代码
每次都是上一个 *2,
aiStack56 是 int32[6], [0] 是1, 每次往后 * 2
{1,2,4,8,16,32}。。。
然后看
read_six_number
code
查 zeal ,sscanf 返回值是转换了多少个值。
根据上文猜出 iVar2 是地址,所以 +4n 是偏移值。
所以 s 是
1 2 4 8 16 32 64
三
code
uStack16 有 8 种可能,对应 iVar1 ,对应 aiStack12[0]
关键是找 0x4025cf 里有什么
看反汇编得到
不妨
uStack16 = 0
0xcf 是 207
0 207
解决四
code
iVar2 说明只能匹配 2 个数, aiStack12[0]==0 说明第二个数是 0
0xe = 14
14 ≥ uStack16
下面看 func4
code
写测试代码
0 1 3 7
所以第一个数 0 1 3 7 都可
五
code
arg1 长度 6
acStack24 应该得到 flyers
注意 0xf == 15, 所以
"maduiersnfotvbyl"
只有这些f: 9
l: 15
y:14
e:5
r:6
s:7
注意到前面是指针转换,所以 arg1 是一个
char *
。每次往后取偏移位。对应 ascii"9on567"
六
ida pro 先逆向
code
开始分析
分 2 个。
说明所有的都是 1,2,3,4,5,6
说明互不相同
v1[n] = 7-v1[n]
猜测 v6 是个链表。
观察一下发现有 3 个字段。value, index, next (value 转成 10 进制)
值是(这里沿用 16 进制)
比如 D0 + 8 = D8, 说明 *(v6 + 8) 是取 next
说明这段是根据输入的 a1 a2 … a6 把链表写入 arr1 数组。aN 对应 arr[N]
根据下文的推断,arr1 是个存了结构体指针的数组。
所以这段是线性表 to 链表
v9 = *( v9+8 )
是 v9 = v9->next
,说明 v9 是个结构体指针。**(v9 + 8)
是 *(v9->next)
,因为首地址是 struct 的 val, 所以就是 v9->next->val
所以 result 是下一个,if 这个 < 下个,炸弹 explode, 所以这个 > 下个(互不相同),说明这段代码约束递减。
概括一下:
- all in [1,6]
- all diff
- 7 - aN
- node to arr
- arr to node
- check ascend
写一段 py 跑一下
答案
4 3 2 1 6 5
隐藏关
观察发现还有一题
v3 == "DrEvil"
注意到前面是 2 个 %d, 尝试修改题目 3, 4 ,发现把 4 的输入追加
DrEvil
可以进入隐藏关。参考 https://blog.csdn.net/neverever01/article/details/78403412看 secret_phase 是什么
strtol 是 str to long
v2 [1, 1001]
注意到 n1 的 step 是 8, 多次按 D 把 step 改成 dq ,ida 识别出这是指向另外一个地址的指针。
什么结构体有一个 val, 两个指向别人的指针呢?
整理一下 .data 段里的树的样子(值都改成了 10 进制)
第 x 行第 y 个对应 nxy
上文的基础上重写 fun7 函数
根据上文,fun7 需要 return 2
可以推出是最里层返回 0, 上一层返回 2 * fun7() + 1, 再上一层返回 2 * fun7()
36 > a2 && 8 < a2 && a2 == 22
所以 a2 == 22
附答案,运行
./bomb ans.txt