解决黑客攻击中的困境:剥削的艺术

时间:2011-11-13 05:00:23

标签: macos debugging memory addressing shellcode

我最近买了这本书,标题是:黑客:剥削的艺术(第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)将输出管道输出到grep with main:作为正则表达式并显示前20行。然后用gdb调试并在main处断开。 这是我的主要问题:所有内存地址都不同!! 例如,书中的eip是: 0x804837a 。但是我的计算机有rip它是: 0x100000ee8 我以为这只是因为我使用的是64位操作系统,但是当我使用32位版本的Darwin启动时,我得到了相同的结果。如果有人知道这个问题是什么,我会非常感激。如果这真的很蠢,请给我一个休息时间,我刚满14岁:)

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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