脱壳
将程序拖入查壳工具后,显示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}
本文介绍了如何通过upx脱壳和使用OD工具对程序进行调试,详细过程包括设置硬件断点、跟踪函数变化和获取flag。核心内容涉及程序逆向、调试技巧和特定字符串操作的破解。
468





