一顿分析
对于一个逆向小白来说,在这题上着实花了点时间,特记录下~

初看这题时,感觉就是数据题,经过一顿操作,发现1-8依次输一边,答案就出来了,反正每盏灯只能操作奇数次。

但是这样的方式做一道“逆向”题,着实没啥成就感,反正刚学习,那就从简单题开始吧。
载入Ollydbg先看看,通过查找参考字符串找到了函数的地址00B7E940

右键查看调用树(或者右键转到,可以看到最下方是调用地址),可定位到函数调用处
(调用树)

(上一个jmp)

(关键判断处)

我们找到了一个jnz和call的地方,因为不是flag的直接比较,所以想法是跳转至成功函数输出flag,或者直接将生成flag的函数吃透。
方法一:修改汇编代码完成跳转
我们找到了一个jnz和call的地方,因为不是flag的直接比较,所以想法是跳转至成功函数输出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
执行如下
![]()
本文记录了一位逆向新手在Bugku平台解决ConsoleApplication4游戏的过程,主要涉及使用Ollydbg和IDA进行动态和静态分析,通过修改汇编代码跳转至成功函数,以及理解flag生成逻辑。通过分析函数调用、数组操作和位运算,最终成功过关。
&spm=1001.2101.3001.5002&articleId=82844643&d=1&t=3&u=2c8faa7ec13347a4871458ca5834cefa)

被折叠的 条评论
为什么被折叠?



