脱壳
将程序拖入查壳工具后,显示upx壳
使用官网的upx脱壳失败
这里有两种方法:
1:多去试试几个脱壳工具
2:使用od来进行脱壳
将程序拖入od
可以看到pushad对程序进行了压栈
单步执行一下,在ESP处设置一个硬件断点
然后运行程序,断下来后在调试里再删除硬件断点,否则程序会一直断下来
然后继续单步执行,发现下面有个小的循环,直接在下面的跳转处设置一个断点,运行到下面的跳转,然后单步执行
这样就找到了程序原本的入口点,然后获取eip作为oep脱壳保存即可
分析
将脱壳后的程序放入IDA中
限定了输入的字符串个数为19个,且输入只能是L或R,否则就直接error。而在开头用了一个伪随机数,伪随机数不管在任何电脑上运行输出的都是同一个结果
根据程序运行时提示的maximum和题目mountain climbing可以猜测本题目为获取最大值,所以将伪随机数数组弄出来看看
RRRRRLLRRRLRLRRRLRL
而我们的输入经过了一个函数的修改,我们的目的是输入的字符串经过这个函数的变化后变成RRRRRLLRRRLRLRRRLRL
在IDA里跟进这个函数里看看
emmm,不太看得懂,进OD里面调一下吧。
调试
找到这个函数的地址,然后进OD调试下断点
在00411CBA处下一个断点,然后直接运行
将我们的字符串输入进去
00411C8B函数就是修改的函数,直接单步跟进去看一下
继续跟进下面的函数
进去之后看到这样一个东西,可以发现就是之前change函数最里面的那个地方
在最下面有个retn,我们直接让他执行到retn
返回到了这里,我们继续单步跟进,注意观察寄存器窗口,发现我们的参数后直接跟随数据窗口,在下面可以看到进行了一个xor 4与4进行异或的操作,我们一直跟进来观察数据窗口的变化
从数据窗口中可以看到,进行了偶数位跟4异或的操作
直接执行完后将这串字符串拿出来或者自己写个脚本即可拿到flag
脚本:
flag:zsctf{RVRVRHLVRVLVLVRVLVL}