CE教程第8/9关记录
第8关:密码525927
1.找到给定数值的地址。
地址为0x18d4440
2.右键点击改写该地址
可以看见只有一条指令。并且也推荐了一个指针,恰好也是esi寄存器的值。0x18d4428
3.新的16进制扫描刚才esi的值。
把这唯一的一条添加到地址(如果不唯一,就需要采取其它方式过滤一下)
得到指针0x1863300,继续扫描看看。
把这唯一的一条添加到地址(如果不唯一,就需要采取其它方式过滤一下)
得到指针0x18d411c,继续扫描看看
哦吼,搜不到了。这个时候只能继续用调试器了。但是因为没有改变这个值,就只能通过访问的方式。
然后点击改变数值。
调试器如下:
cmp不是移位指令,不用管。直接看下面这条。
需要注意的是,我们并不能总是看指令里面包含的寄存器,而应该看看CE推荐的指针地址。
这里是0x18d4108,我们继续搜索。
把这唯一的一条添加到地址(如果不唯一,就需要采取其它方式过滤一下)
得到指针0x186342c,继续扫描看看。
还是找不到,只能继续调试了。
数一数,已经三级偏移了。
*(*(*(*186342c+14)+0)+18) = 2556
题目说是四级,这个时候,就利用改变指针的条件了。
使用改变该地址的调试器。
哦吼,直接炸裂,归0了。
从头开始走一遍,到这里,选择访问调试器。
后面地址变了。但是寄存器偏移,指令是类似的。
把推荐的指针拿来搜索。0x18fb120。
终于找到了绿色的地址。把它拉下去,就齐活了。
接下来,就是如何从6426e0到267的工作了。
*(*(*(*(*6426e0+c)+14)+0)+18) = 267
用C语言的方式,描述一下,就好理解了。
添加以后,空格锁定,这个时候再点击改变指针,就能顺利通关了。
第9关:密码31337157
感觉还稍微容易一点。
因为题目说明了是共享代码,当然也可以自己通过调试寄存器看看代码逻辑。
这种共用代码的。很像C++里面,同一个类的对象,然后修改血量,只是对类的对象的属性进行修改。
我们找kitt的,攻击一下,反汇编看看。
kitt的地址是0a92d04c,而ebx是0a92d048,正好也是CE推荐的指针地址。
并且,这个地址和kitt的地址很接近了。恰好就是ebx+4.
也就是说执行这条语句的时候,eax代表剩余血量。我们只要注入代码改一下。
比如在 mov [ebx+04],eax前面,对eax动下手脚。
我们发现我们满血才100,敌人满血又超过100,所以可以靠血量区分
if(eax>100)
{
eax = 0
}
mov [ebx+04],eax
起到类似的效果就好了
当然了,这里恰好能行,但是万一执行的时候敌人剩余血量少于100,就不能秒杀了。
所以还可以看看其他方法。
通用方法:这是一个C++类,而这又是一个分阵营的对象,那个这个类里面一定有区分阵营的数据存在。
可以依次浏览4人的内存区域。
可以比较轻松的发现,每个人血量后+C可以明显分出是敌是友。
为1就是友军,为2就是敌军。
也就是反汇编代码,ebx+10的位置。
我们找个角色,进行改写地址调试。
然后自动汇编。
cmp [ebx+10],2
jne originalcode //不是2,就是友军,正常扣血吧
mov eax,0 //是敌军,直接秒杀
只需要加入这3行代码,然后执行就好了。
执行以后,点击重启游戏并自动执行
敌人直接GG,点击下一步,也就顺利毕业了。