我正在阅读一本名为 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。
答案 0 :(得分:0)
我想我可能有答案 - 你的argv [1]指向30&#39;并且你有一个16的密码缓冲区.strcpy()将填充缓冲区和超出。
我会将缓冲区大小增加到更大的大小(比方说255个字节)。
在实践中,您应该检查您的代码,甚至示例,并使它们更健壮(例如:允许更大的密码,然后16)
答案 1 :(得分:-1)
请减少 As try A(17) 次它会起作用