2

我很难理解书中的 C 代码(The Shellcode's handbook):

#include <stdio.h>
unsigned long find_start(void)
{
        __asm__("movl %esp, %eax");
}
int main()
{
        printf("%x\n",find_start());
}

如果我用 gdb 运行它不止一次,我总是得到相同的结果(相同的地址):

(gdb) r
Starting program: /tmp/a.out 
***bffff4a8***
[Inferior 1 (process 5384) exited with code 011]
(gdb) r
Starting program: /tmp/a.out 
***bffff4a8***
[Inferior 1 (process 5387) exited with code 011]
(gdb) r
Starting program: /tmp/a.out 
***bffff4a8***
[Inferior 1 (process 5388) exited with code 011]

这对我来说没问题,但是当我在没有 gdb 的情况下运行它时,结果会发生变化:

root@debian:~# /tmp/a.out 
***bfb5f2b8***
root@debian:~# /tmp/a.out 
***bffa6c58***

你知道为什么吗?(我在Debian 7上)

谢谢你

4

1 回答 1

2

默认情况下gdb禁用地址空间随机化 (ASLR)。

在 中查看随机化状态gdb

(gdb) show disable-randomization

要启用它gdb

(gdb) set disable-randomization

要为您的进程禁用地址随机化:

sudo sysctl -w kernel.randomize_va_space=0

要禁用特定程序的地址随机化:

setarch `uname -m` -R program [program_arguments]
于 2013-07-27T15:32:36.420 回答