ce新手教程 第八关 多级指针

最近看了一下滴水三期的CE部分,因为先前有过前科,自己有学习和了解过一点ce的操作
昨天就当复习一下基本操作,去做了一下教程题
昨天卡在了第八题多级指针

我发现我自己在偏移和结构上的概念有点缺失

我们直接来看这道题
PixPin_2026-05-27_14-28-52

找到这个值是基本操作,这里不说明了

接下来我们改变数值,去找出什么改变(write)这个地址
PixPin_2026-05-27_14-31-37

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的地址是什么
PixPin_2026-05-27_14-44-33
地址0x09AA1EC0存放了数据0x09AA8970
我们现在需要查看什么访问(access)了这个地址

这里其实我有一个疑问这个多级指针怎么解引用(访问)
(((P))) 大概是这样的,所以我们可以通过查看访问确定上一级指针

PixPin_2026-05-27_14-49-25

PixPin_2026-05-27_14-49-58
划重点:对于ce猜测的指针,需要辩证的看待
ce停的汇编代码处,其实已经执行过了,寄存器的状态也是暂停处的汇编代码执行过后的结构

所以的rsi就是存放0x09AA8970的地址

*rsi = 0x09AA8970
rsi = 0x09AA1EC0
mov rsi, [rsi]
mov rsi, [0x09AA1EC0]    //执行后rsi = 0x09AA8970

所以我们也确定了第二级指针
现在我们查看0x09AA1EC0的地址
PixPin_2026-05-27_14-56-27

查看什么访问了这个地址
PixPin_2026-05-27_14-58-10

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

第三级指针为0x09AA9450

接下来我们找第四级指针
PixPin_2026-05-27_15-07-11

查看什么访问了这个地址
PixPin_2026-05-27_15-08-34

所以四级指针就是0x01638510

我们在往上找,就可以找到基地址了
PixPin_2026-05-27_15-09-49

基地址为0x10034ECA0
PixPin_2026-05-27_15-11-02

现在我们就可以添加指针了
PixPin_2026-05-27_15-12-18
PixPin_2026-05-27_15-13-19
PixPin_2026-05-27_15-14-05

我们改变指针,我们添加的指针的结果还是指向数据的,说明我们找的是正确的,改变指针,然后把数值改成5000,就可以进入下一关了。

总结

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

posted @ 2026-05-27 15:26  书与兔子  阅读(8)  评论(0)    收藏  举报