0

我最近买了这本书,书名是:黑客:剥削的艺术(第 2 版),它最近一直困扰着我。无论如何,使用其中一个示例 firstprog.c :

#include <stdio.h>
int main() {
int i;
for(i=0; i < 10; i++) {
// Loop 10 times.
printf("Hello, world!\n"); // put the string to the output. }
return 0; // Tell OS the program exited without errors. }

它让你用 gcc 编译它(显然 :3 ),然后使用 objdump (为此,我只使用了 gobjdump,找不到 OS X 的 objdump )将输出通过 main.: 管道输出到 grep.: 作为正则表达式并显示前 20线。然后用 gdb 调试并在 main 处中断。这是我的主要问题:所有内存地址都不同!比如书中的eip是:0x804837a。但是对于我的电脑,它是:0x100000ee8我认为这只是因为我使用的是 64 位操作系统,但是当我使用 32 位版本的 Darwin 启动时,我得到了相同的结果。如果有人知道这个问题是什么,我将不胜感激。如果这真的很愚蠢,让我休息一下,我刚满 14 岁 :)

4

2 回答 2

3

我确定您正在学习逆向工程,因此您还应该查看ASLR是什么。这就是为什么您的程序的偏移量与书中的偏移量不同的主要原因它基本上随机化了您的程序在内存中的位置,因此您无法创建将地址硬编码为 shell 代码的漏洞利用。这使得创建漏洞利用变得更加困难。

于 2011-11-13T05:05:05.310 回答
2

您获得的地址几乎总是与书中显示的地址不同。哎呀,地址可能会在同一系统上的不同运行之间发生变化。

于 2011-11-13T05:04:06.773 回答