gpt4 book ai didi

c++ - 不应该发生的缓冲区溢出(?)

转载 作者:搜寻专家 更新时间:2023-10-30 23:58:22 25 4
gpt4 key购买 nike

我有以下程序

 1  #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 int check_authentication(char *password){
6 char password_buffer[16];
7 int auth_flag =0;
8
9
10 strcpy(password_buffer, password);
11
12 if(strcmp(password_buffer, "brillig" ) == 0 )
13 auth_flag = 1;
14 if(strcmp(password_buffer, "outgrabe") == 0)
15 auth_flag = 1;
16
17 return auth_flag;
18 }
19
20 int main(int argc, char *argv[]){
21 if (argc<2){
22 printf("Usage: %s <password>\n", argv[0]);
23 exit(0);
24 }
25
26 if(check_authentication(argv[1])){
27 printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
28 printf(" Access Granted.\n");
29 printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
30 }
31 else {
32 printf("\n Access Denied. \n");
33 }
34 }

我正在运行它,通过 gdb 提供 30 个字节的 As... 我正在设置以下断点

(gdb) break 9
Breakpoint 1 at 0x80484c1: file auth_overflow2.c, line 9.
(gdb) break 16
Breakpoint 2 at 0x804850f: file auth_overflow2.c, line 16.
(gdb) run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

到目前为止一切顺利。一切都按预期进行,直到下一个断点

Breakpoint 1, check_authentication (password=0xbffff6d2 'A' <repeats 30 times>)
at auth_overflow2.c:10
10 strcpy(password_buffer, password);
(gdb) x/s password_buffer
0xbffff484: "\364\237\374\267\240\205\004\b\250\364\377\277\245", <incomplete sequence \352\267>
(gdb) x/x &auth_flag
0xbffff494: 0x00

现在我们看到如下信息:

变量auth_flag在地址0xbffff494,变量buffer在地址0xbffff484。由于 var auth_flag 的地址大于缓冲区的地址,并且堆栈向较低地址增长,这意味着缓冲区变量中的额外(缓冲区溢出)字节将不会覆盖 auth_flag。对吧?

但是gdb有不同的看法...

(gdb) cont
Continuing.

Breakpoint 2, check_authentication (
password=0xbf004141 <Address 0xbf004141 out of bounds>)
at auth_overflow2.c:17
17 return auth_flag;
(gdb) x/s password_buffer
0xbffff484: 'A' <repeats 30 times>
(gdb) x/x &auth_flag
0xbffff494: 0x41

和...

(gdb) x/16xw &auth_flag
0xbffff494: 0x41414141 0x41414141 0x41414141 0xbf004141
0xbffff4a4: 0x00000000 0xbffff528 0xb7e8bbd6 0x00000002
0xbffff4b4: 0xbffff554 0xbffff560 0xb7fe1858 0xbffff510
0xbffff4c4: 0xffffffff 0xb7ffeff4 0x080482bc 0x00000001

我们看到 auth_flag 被这些 0x41 (=A) 覆盖,尽管这个变量在堆栈中处于较低位置。为什么会这样?

最佳答案

堆栈增长方向与缓冲区溢出时额外字节的去向无关。 strcpy 的溢出总是会进入更高的地址(除非溢出到你回绕到地址 0,这是不太可能的)

关于c++ - 不应该发生的缓冲区溢出(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20748146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com