c - 基于堆栈的缓冲区溢出漏洞

标签 c

我正在阅读一本名为黑客:利用的艺术的书,并且我对基于堆栈的缓冲区溢出漏洞部分有疑问。 我按照作者给出的说明进行操作,但没有得到预期的结果。

首先,这是从书中复制的程序auth_overflow2.c:

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

int check_authentication(char *password) {
   char password_buffer[16];
   int auth_flag = 0;

   strcpy(password_buffer, password);

   if(strcmp(password_buffer, "brillig") == 0)
      auth_flag = 1;
   if(strcmp(password_buffer, "outgrabe") == 0)
      auth_flag = 1;

   return auth_flag;
}

int main(int argc, char *argv[]) {
   if(argc < 2) {
      printf("Usage: %s <password>\n", argv[0]);
      exit(0);
   }
   if(check_authentication(argv[1])) {
      printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
      printf("       Access Granted.\n");
      printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
   } else {
      printf("\nAccess Denied.\n");
   }
}

这是我的 Ubuntu 终端的副本:

(gdb) break 19

Breakpoint 1 at 0x40077b: file auth_overflow.c, line 19.

(gdb) break 7

Breakpoint 2 at 0x4006df: file auth_overflow.c, line 7.

(gdb) break 12

Breakpoint 3 at 0x40072a: file auth_overflow.c, line 12.

(gdb) run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Starting program: /home/test/a.out AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA


Breakpoint 1, main (argc=2, argv=0x7fffffffdf08) at auth_overflow.c:19

19      if(check_authentication(argv[1])) {

(gdb) i r esp

esp            0xffffde10   -8688

(gdb) x/32xw $esp

0xffffffffffffde10: Cannot access memory at address 0xffffffffffffde10

(gdb) c

Continuing.


Breakpoint 2, check_authentication (password=0x7fffffffe2cc 'A' <repeats 30 times>) at auth_overflow.c:7

7       strcpy(password_buffer, password);

(gdb) i r esp

esp            0xffffddc0   -8768

(gdb) x/32xw $esp

0xffffffffffffddc0: Cannot access memory at address 0xffffffffffffddc0

(gdb) p 0xffffde10 - 0xffffddc0

$1 = 80

(gdb) x/s password_buffer

0x7fffffffdde0: "\001"

(gdb) x/x &auth_flag

0x7fffffffdddc: 0x00

(gdb) 

当我尝试 x/32xw $esp 时,我得到: 0xffffffffffffde10:无法访问地址0xffffffffffffde10处的内存

当我继续到第二个断点时,也会发生同样的情况。 当作者输入 x/s password_buffer 时,输出为:

0xbffff7c0: "?o??\200?????????o???G??\020\205\004\b??????\204\004\b????\020\205\004\bH??????\002"

但我的输出如下所示:

0x7fffffffdde0:“\001”

我的 i r esp 结果也与书上不同。

书中有两个十六进制数:

esp 0xbffff7e0 0xbffff7e0

我正在使用 Ubuntu、GCC 和 GDB。

最佳答案

我想我可能已经有了答案 - 你的 argv[ 1 ] 指向 30 'A - 并且你的密码缓冲区为 16。strcpy() 只会填充缓冲区并超出。

我会将缓冲区大小增加到更大的大小(例如 255 字节)。

在实践中,您应该检查您的代码,甚至是示例,并使它们更加健壮(例如:允许大于 16 的密码)

关于c - 基于堆栈的缓冲区溢出漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320531/

相关文章:

c - 使用 LibJpeg 将 YUV 转换为 jpeg 时出现段错误

c - 对变量和指针使用相同的名称两次(c 编程)

c - 我需要内存屏障吗?

c - 如何通知编译器 `getcontext` 可以多次返回?

c++ - 使用用 c/c++ 编写的共享库的 Linux C 程序

c - IP cidr匹配功能

c - malloc 防止垃圾被打印?

c - 计算空格、制表符和换行符的程序输出

c - 包装函数的内联汇编器由于某种原因不起作用

c - 结构中的数组和结构的 Malloc