打开附件是一个exe可执行程序
这里的游戏说明大概的意思就是,打开这八条线路的开关使八盏灯同时亮起来。
方法一
由于游戏难度不高,可以选择跟着他的游戏规则来
最简单的做法之一,就是从一按到八就能完成
但是这太没技术含量了,相信来刷题的肯定不会止步于此,比赛的话另说。
方法二
先丢到exeinfo里看一下,发现这是一个用c语言写的32位exe文件,且无壳
既是32位,我们就用ida32打开1,F5一键反编译,Alt+T查找main函数。
跳转之后,看到了运行时显示的规则,还有数字输入错误的提示,那我们继续往下看
看到有一串代码是对输入值的大小进行检测,如果符合条件则break中止,如果不符合条件,则触发sub_45A8BE,通过int提示try again。
下面还有一个对v4进行处理的代码,看看里面有什么
通过sub_4576D6跳转两次后看到。这里的作用是对字符进行替换
继续回到main函数,这里是对结果的检测,看起来很像通关之后的跳转
通过sub_457AB4跳转2次后看到,flag!!!
先别激动,这里看起来还要我们算一下
如果学过c语言这里就很好懂了,没学过问题也不大,这里就是一个for循环,i从0开始,先进入循环,每循环一次i+1
下面的^=的意思是进行或运算,0x13是16进制,后面的u嘛,是c语言里的东西,意思是无符号整型常量,不用管
*(&v2 + i) 是 C 语言中的指针运算。它的含义是将数组 `v2` 的地址加上 `i` 个元素的偏移量,然后通过 `*` 运算符取出结果所指向的值。
这种写法可以方便地对数组进行遍历,通过简单的指针算术实现对数组元素的访问和操作。
在给定的代码中,`*(&v2 + i)` 就是访问数组 `v2` 在索引 `i` 处的元素。
请注意,在指针运算中,`&` 运算符表示取地址,`*` 运算符表示取指针指向的值。
通过这样的指针运算,可以实现对数组元素的逐个访问。
我们把v2和v59地址增加后的数字编写进数组
那么我们写一个python脚本
v59 = [18, 64, 98, 5, 2, 4, 6, 3, 6, 48, 49, 65, 32, 12, 48, 65, 31, 78, 62, 32,
49, 32, 1, 57, 96, 3, 21, 9, 4, 62, 3, 5, 4, 1, 2, 3, 44,65, 78, 32, 16,
97, 54, 16, 44, 52, 32, 64, 89, 45, 32, 65, 15, 34, 18, 16, 0]
v2 = [123, 32, 18, 98, 119, 108, 65, 41, 124, 80, 125, 38, 124, 111, 74, 49, 83, 108, 94,
108, 84, 6, 96, 83, 44, 121, 104, 110, 32, 95, 117, 101, 99, 123, 127, 119, 96, 48,
107, 71, 92, 29, 81, 107, 90, 85, 64, 12, 43, 76, 86, 13, 114, 1, 117, 126, 0]
flag = ' '
for i in range(56):
v2[i] ^= v59[i]
v2[i] ^= 0x13
flag += chr(v2[i])
print(flag)
运行后得到
ida安装后会出现两个快捷方式,一个ida32,一个ida64,分别用于不同位数的文件 ↩︎