我正在阅读一本名为黑客:利用的艺术的书,并且我对基于堆栈的缓冲区溢出漏洞部分有疑问。 我按照作者给出的说明进行操作,但没有得到预期的结果。
首先,这是从书中复制的程序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/