为什么要用CE?,有些值不能通过句柄的方式获取,所以要通过搜索的方式获取。
第二关
当前就是一个进程,我们想找健康100在哪里存着
首先我们知道要查找的值是100,所以我们就选择精确数值,如果不知道具体,只知道在0-100之间,我们可以选择值介于....两者之间,值大于、值小于和未知初始值同理
输入100点击首次扫描,数值一般情况下都是4字节,先从最有可能的开始搜索
起始是 0000000000000
停止是 7fffffffffff
这个范围是用户空间可以搜索,内核空间不能搜索
搜索到了很多100,怎么判断哪个100是我们想要的要通过变化,点击打我,健康变成97,然后再用97再次扫描
发现此时只有一个了
双击修改,即可通过
第三关
注意:换题的时候一定要先点击新的扫描
我们只知道这个数值在0到500之间,所以要用介于...两者之间,输入0和500,点击首次扫描,然后点击打我,这个时候扫描类型要选择,数值减少了.. 这里点击打我-6 所以我在此扫描的数值是6
最后双击修改数值,通过。
第四关
和第二关差不多,只需要改变数值类型为双浮点和单浮点即可。
第五关
题目:有一段代码,会改变100这个数值,我们需要找到这段代码,并且把这段代码干掉,不让这个代码改变数值
还是先输入100,然后通过变换找到存放100的地址
找到这个地址之后
然后再次点击改变数值
就会看到有一条汇编指令,说明这行汇编代码改变的数值
查看详细的反汇编信息
这个反汇编的意思是edx是修改之后的值 eax是地址 [eax]取eax地址里面的值,那么怎么让这个反汇编不起作用呢,用nop填充即可。
第六关
有时候数值存储在指针中,比如用malloc分配的一块内存来存储这个数值
前面的操作和上面一样
这段反汇编代码说明的是 eax修改edx地址指向的值,而edx存储的是006426B0指向的数值,所以每次点击改变指针的时候,006426B0里面指向的值都会变,所以我们要添加一个指针
这样我们可以看到,一旦我们点击了改变指针,在点击改变数值,我们添加的地址里面的数值会变化,而通过搜索的不会变化。改为5000即可过关。
第七关
题目:点击打我的时候,会改变100数值,我们需要做的是把修改这个值的代码换掉,本来点击一次是-1,我们换掉之后可以-2,-3或者+1,+2
还是之前的方式查看反汇编
这里我们可以看到,硬编码是6个字节,如果我们想要想改成我们想要的效果,我们的反汇编必须要在6个字节以内,不能超过6个字字节,这样就用很多的限制,所以我们可以通过jmp跳转到我们想实现的反汇编代码,然后再通过jmp调回来,当然这是一个思路,有工具就不要这么麻烦
通关。
第八关
基址就是内存地址不变的一个值(重启程序之后,地址不会发生变化),可以是全局变量,CE里面的基址是绿色的,黑色的是由malloc动态分配的,重启程序之后,这个地址可能会发生变化,
可以看到这个地址是黑色的,所以是在堆里面动态分配的
可以看到,eax里面存储的是1764,把1764放到了esi+18这个地址里面,+18其实就是偏移,偏移就是结构体的某个成员,但一定不是第一个成员,所以我们需要找esi到底是哪里来的,就是看谁里面存了esi,esi是017FD580,所以我们要查找谁存了017FD580
发现此时017EEB70是我们想要的,那可不可以一直往后搜索呢,搜索谁存储了017EEB70呢?是不行的,因为有可能可能没有人存储017EEB70,017EEB70有可能是一个基址加上一个偏移得来的(基址+偏移),所以我们应该搜索基址,所以我们应该看下代码,是不是基址+偏移,此时我们要跟踪esi,所以要看是谁读出esi
此时没有偏移,说明从esi地址里面的值放到了esi里面,发现EAX里面存的值是017EEB70,不是基址+偏移,所以我们此时可以搜索017EEB70
发现还不是绿色的,做法和上面一样,判断是不是基址+偏移,看谁访问了017EEB04
此时发现EAX是017EEAF0,+14正好等于017EEB04,所以我们应该搜索017EEAF0,依次重复这样的方式直到找到绿色的为止
[[[[[006426E0]+0C]+14]+0]+18],总共有4级偏移
注: 改变指针就是重新在堆里面分配了一个空间放入全局变量当中。
通关!