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

时间:2015-07-09 14:30:04

标签: c

我正在阅读一本名为 Hacking:Exploit Art of Exploitation 的书,我对基于堆栈的缓冲区溢出漏洞部分有疑问。 我遵循作者的指示,但我没有得到预期的结果。

首先,这是从书中复制的程序 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:&#34;?o ?? \ 200 ????????????????????????????????????????????? ??? \ 020 \ 205 \ 004 \ BH ??????? \ 002&#34;

但我的输出如下:

0x7fffffffdde0:&#34; \ 001&#34;

我的结果也与本书有所不同。

书中的

有两个十六进制数字:

esp 0xbffff7e0 0xbffff7e0

我正在使用Ubuntu和GCC以及GDB。

2 个答案:

答案 0 :(得分:0)

我想我可能有答案 - 你的argv [1]指向30&#39;并且你有一个16的密码缓冲区.strcpy()将填充缓冲区和超出。

我会将缓冲区大小增加到更大的大小(比方说255个字节)。

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

答案 1 :(得分:-1)

请减少 As try A(17) 次它会起作用

相关问题