看主函数这里,可以知道 v4 就是 unk_403040 这个数组,关键部分是 vm_operad 函数并且将 v4 传了进去
# vm_operad 函数
1 | int __cdecl vm_operad(int *a1, int a2) |
这里 a1 就是 v4 数组,并且以其中的值来确定 case
转到 16 进制窗口,获取一下数据,因为 case 中没有 0 所以 0 可以去掉
1 | 0x0A,0x04,0x10,0x08, 0x03,0x05,0x01,0x04, 0x20,0x08,0x05,0x03, 0x01,0x03,0x02,0x08, |
第一个数据是 0x0A 也就是 10,看到 case10,点进去之后发现 case10 就是输入 flag 的函数,储存在 Str 中,长度为 15
# case1
1 | case 1: |
在后面的几个 case 中,分别对输入的 flag 进行了一些运算,然后我们通过 case1 来储存计算后的值的下标,即 100-114,15 个数据
# case7
1 | case 7: |
在 a1 数组中我们可以看到最后面有很多的 7,这一段就是对之前的 flag 的计算进行比较,计算后的结果是要等于 a1 数组中 7 后面的数据的,数了一下发现,刚好有 15 个 7,也就是 flag 的长度,刚好和 flag 进行比较,将这 15 个数据单独拿出来
1 | 0x22,0x3f,0x34,0x32,0x72,0x33,0x18,0xa7,0x31,0xf1,0x28,0x84,0xc1,0x1e,0x7a |
# 总体思路
在输入 flag 之后,函数将 flag 的每一位进行一个运算,运算之后通过 case1 来储存计算后的结果,计算并储存完之后再通过 case7 来对比是否等于它已经给出的密文
# 脚本
1 |
|
得到 flag {757515121f3d478}
题目来源:BUUCTF 在线评测 (buuoj.cn)——[网鼎杯 2020 青龙组] singal