这个第八题我花了好几个小时,最后靠画图弄明白的。
不管是C语言还是反汇编,涉及到指针和内存,最直观的理解方式就是画图。
步骤 8: 多级指针: (密码=525927)
在这一步将解释如何使用多级指针。 在第 6 步,你已经清楚 1 级指针的概念和用途,并可以利用数值的首个地址找到存放数据真正的基址。
在本关中,你将看到 4
级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向健康值的真正地址。 开始的几步与在第
6
步中的操作基本相同。找出是什么访问了这个地址,然后分析汇编指令,查找指针地址中的数值,以及它的偏移量,将它们记下来。但这次你按数值找出的仍然是一个指针,你得依据这些数值,使用同样的操作方法找出指向这个指针的指针。看看是什么访问了你发现的那个指针地址,分析汇编指令,留意可能的代码和偏移量,并加以利用。
持续这种过程,直到不能更进一步查找为止(通常基址为静态时,地址将以绿色标示)。 点击"改变数值"改变健康值,
如果你发现列表中那些指针地址所指向的值发生同样的变化时,那表示你可以试着将基址中的值更改为 5000,并锁定它,以便完成本关的任务了。备注1: 本步骤也可以使用自动汇编程序脚本或者使用指针扫描器加以解决。 备注2: 在某些情况下,可以改变 CE 软件"代码查找"的相关设置。
当你遇到类似于 mov eax,[eax] 的指令时,调试程序将显示改变之后的寄存器中的值,也许利用它更容易找出指针的位置。备注3:
你还在读?!当你查看汇编指令时你可能已经注意到,这些指针是在相同的代码块(相同的程序,如果你懂汇编,可以查看程序的起始代码)位置被读写。这种情况并不总会发生,但是当你在查找某个指针遇到问题的时候,没准能起到很大的用处。
首先,让数值变化,最终找到数值存储的地址。
#include <stdio.h>#include <malloc.h>int main(){//__asm {//moveax, 5//addeax, 6//}int *p1 = (int *)malloc(4);int **p2 = &p1;int ***p3 = &p2;int ****p4 = &p3;****p4 = 100;printf("%d\n", *p1);printf("%d\n", **p2);printf("%d\n", ***p3);printf("%d\n", ****p4);****p4 = 5000;printf("%d\n", *p1);printf("%d\n", **p2);printf("%d\n", ***p3);printf("%d\n", ****p4);return 0;}
以C语言举例,其实就是要找到 p4。
联系客服