【发布时间】:2013-04-13 20:02:44
【问题描述】:
我正在研究缓冲区溢出并解决一些兵棋推演。 有一个问题,缓冲区上方的所有堆栈内存都设置为0,除了main的返回地址,它将是:
buffer
[0000000...][RET][000000...]
我可以覆盖那个 RET。 所以我找到了一些解决这个问题的提示。 这是使用 LD_PRELOAD。 有人说 LD_PRELOAD 的值不仅在堆栈的环境变量区域中,而且在堆栈的某个地方。 所以我设置了 LD_PRELOAD 并搜索它并使用 gdb 找到它。
$ export LD_PRELOAD=/home/coffee/test.so
$ gdb -q abcde
(gdb) b main
Breakpoint 1 at 0x8048476
(gdb) r
Starting program: /home/coffee/abcde
Breakpoint 1, 0x8048476 in main ()
(gdb) x/s 0xbffff6df
0xbffff6df: "@èC\001@/home/coffee/test.so"
(gdb) x/s 0xbffffc59
0xbffffc59: "LD_PRELOAD=/home/coffee/test.so"
(gdb) q
The program is running. Exit anyway? (y or n) y
$
原来如此! 现在我知道 LD_PRELOAD 的值在缓冲区下面的堆栈上,现在我可以利用了!
但我想知道为什么 LD_PRELOAD 会加载到该内存地址上。 该值也在堆栈的环境变量区域!
这样做的目的是什么? 谢谢。
【问题讨论】:
-
环境由
execve(2)系统调用放入堆栈,根据ABI规范 -
@Basile Starynkevitch 我的意思是 LD_PRELOAD 放在两个地方。
-
@lbyeoksan 我敢肯定 Basile Starynkevitch 知道他在说什么。
-
我想你会找到
argv[argc+1] == environ,所以完整的环境在堆栈上,如果设置了LD_PRELOAD,则包括LD_PRELOAD。 -
@Jonathan Leffler 嗯。我不明白。我认为 argv[argc+1] 在我的问题中有点 0xbffffc59 。那么0xbffff6df呢?
标签: linux memory stack overflow ld-preload