对于一个逆向小白来说,在这题上着实花了点时间,特记录下~
初看这题时,感觉就是数据题,经过一顿操作,发现1-8依次输一边,答案就出来了,反正每盏灯只能操作奇数次。
但是这样的方式做一道“逆向”题,着实没啥成就感,反正刚学习,那就从简单题开始吧。
载入Ollydbg先看看,通过查找参考字符串找到了函数的地址00B7E940
右键查看调用树(或者右键转到,可以看到最下方是调用地址),可定位到函数调用处
(调用树)
(上一个jmp)
(关键判断处)
我们找到了一个jnz和call的地方,因为不是flag的直接比较,所以想法是跳转至成功函数输出flag,或者直接将生成flag的函数吃透。
我们找到了一个jnz和call的地方,因为不是flag的直接比较,所以想法是跳转至成功函数输出flag,或者直接将生成flag的函数吃透。
(修改汇编)
(新文件)
直接运行,即可获得结果
前面在调试时我已经大致了解了生成的方式(也在堆栈中看到了flag),现在我们载入IDA进行查看,由于OLLY的地址(每次基址都变)和IDA的地址显示有区别,这里还不会对应找。
但是学会了搜索关键字符串
同时也找到了调用函数sub_45E940,
后来跟着动态调试进行测试发现逻辑代码如下
存在两个数组(截取片段示例)
先两个数组按位异或,再与0x13异或。
关键函数
python代码
ss4 = [0x12,0x40,0x62,0x5,0x2,0x4,0x6,0x3,0x6,0x30,0x31,0x41,0x20,0x0C,0x30,0x41,0x1F,0x4E,0x3E,0x20,0x31,0x20,0x1,0x39,0x60,0x3,0x15,0x9,0x4,0x3E,0x3,0x5,0x4,0x1,0x2,0x3,0x2C,0x41,0x4E,0x20,0x10,0x61,0x36,0x10,0x2C,0x34,0x20,0x40,0x59,0x2D,0x20,0x41,0x0F,0x22,0x12,0x10,0x0]
ss8 = [0x7B,0x20,0x12,0x62,0x77,0x6C,0x41,0x29,0x7C,0x50,0x7D,0x26,0x7C,0x6F,0x4A,0x31,0x53,0x6C,0x5E,0x6C,0x54,0x6,0x60,0x53,0x2C,0x79,0x68,0x6E,0x20,0x5F,0x75,0x65,0x63,0x7B,0x7F,0x77,0x60,0x30,0x6B,0x47,0x5C,0x1D,0x51,0x6B,0x5A,0x55,0x40,0x0C,0x2B,0x4C,0x56,0x0D,0x72,0x1,0x75,0x7E,0x0]
flag = ""
for i in range(0,0x38):
flag += chr(ss4[i]^ss8[i]^0x13)
print flag
执行如下