gpt4 book ai didi

c - gdb 的静态地址。没有gdb的改变

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:05 25 4
gpt4 key购买 nike

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

#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 上)

谢谢

最佳答案

默认情况下 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]

关于c - gdb 的静态地址。没有gdb的改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com