【问题标题】:Address woes from Hacking: The Art of Exploitation [closed]解决黑客的困境:剥削的艺术[关闭]
【发布时间】:2011-11-13 05:00:23
【问题描述】:

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

【问题讨论】:

    标签: macos debugging memory addressing shellcode


    【解决方案1】:

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

    【讨论】:

    • 哇!太好了,我从来不知道,谢谢!
    • gdb 有一个禁用 ASLR 的选项,但我仍然不会有相同的地址,对吗?
    • 我认为您不能使用 gdb 禁用 ASLR。参考stackoverflow.com/questions/6325537/…如果禁用了ASLR,如果书中使用的操作系统版本与您的不同,仍然会有所不同。
    • 我在尝试将反汇编风格设置为 intel 时找到了“set disable-aslr on”选项,实际上有一个关于该问题的文章链接:reverse.put.as/2011/08/11/…跨度>
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多