ce新手教程 第八关 多级指针
最近看了一下滴水三期的CE部分,因为先前有过前科,自己有学习和了解过一点ce的操作
昨天就当复习一下基本操作,去做了一下教程题
昨天卡在了第八题多级指针
我发现我自己在偏移和结构上的概念有点缺失
我们直接来看这道题

找到这个值是基本操作,这里不说明了
接下来我们改变数值,去找出什么改变(write)这个地址

mov [rsi+18],eax
eax存放改变的数值
[rsi + 18] 就是这个数值存在的具体地址
不太好理解的话
int a = 1;
int* p = &a;
*p = 20; //改变数值
//[rsi + 18] == *p
//rsi + 18 == 指针p的地址
这里18是什么呢,为什么不直接用rsi,加的这个18有什么用呢
这里就涉及两个关键的东西了,结构 和 偏移
结构体的反汇编代码里面,我们更改结构体成员就会涉及到偏移
rsi = 09AA8970
所以我们可以通过rsi + 18的方式找到数值的地址 我们现在确定了第一级偏移
接下来我们要去查看存放数据0x09AA8970的地址是什么

地址0x09AA1EC0存放了数据0x09AA8970
我们现在需要查看什么访问(access)了这个地址
这里其实我有一个疑问这个多级指针怎么解引用(访问)
(((P))) 大概是这样的,所以我们可以通过查看访问确定上一级指针


划重点:对于ce猜测的指针,需要辩证的看待
ce停的汇编代码处,其实已经执行过了,寄存器的状态也是暂停处的汇编代码执行过后的结构
所以的rsi就是存放0x09AA8970的地址
*rsi = 0x09AA8970
rsi = 0x09AA1EC0
mov rsi, [rsi]
mov rsi, [0x09AA1EC0] //执行后rsi = 0x09AA8970
所以我们也确定了第二级指针
现在我们查看0x09AA1EC0的地址

查看什么访问了这个地址

//搞懂了第二级指针,这里也就迎刃而解了
mov rsi,[rsi+18]
//rsi + 18 = 0x09AA9468 这里的结果是偏移之后的
//所以这个结构的地址为 0x09AA9468 - 18 = 0x09AA9450
//运行后rsi = 0x09AA1EC0
第三级指针为0x09AA9450
接下来我们找第四级指针

查看什么访问了这个地址

所以四级指针就是0x01638510
我们在往上找,就可以找到基地址了

基地址为0x10034ECA0

现在我们就可以添加指针了



我们改变指针,我们添加的指针的结果还是指向数据的,说明我们找的是正确的,改变指针,然后把数值改成5000,就可以进入下一关了。
总结
其实我并没有在第一时间完成,虽然我先前做过,但是我也忘记了,之前还专门看过ce的教程,浅浅学习了一下,那个up提到过划重点里面说的内容,但是我并没有遇到那种情况,这个多级指针刚刚好就用到了,需要懂一点汇编,我先前在结果和偏移上的理解是存在误区的,我感觉教ce的很多只提到了偏移,但是没有说为什么会有偏移,至少我印象来没有,有可能是我没好好听课忘记了,我们真正找的应该是一个完整结构的指针,对于里面的数据,是需要通过偏移的方式使用的。

浙公网安备 33010602011771号