我目前正在第二次阅读《黑客攻防技术宝典》并遇到了一些问题。
这本书提出了两种不同的方法来利用这两个相似的程序:auth_overflow 和 auth_overflow2
在第一个程序中,有一个密码检查函数的布局如下:
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[16];
strcpy(password_buffer, password);
...
}
输入超过16个ASCII字符将会导致auth_flag的值变为大于0的某个值,从而绕过检查,正如此gdb输出所示:
gdb$ x/12x $esp
0xbffff400: 0xffffffff 0x0000002f 0xb7e0fd24 0x41414141
0xbffff410: 0x41414141 0x41414141 0x41414141 0x00000001
0xbffff420: 0x00000002 0xbffff4f4 0xbffff448 0x08048556
password_buffer @ 0xbffff40c
auth_flag @ 0xbffff41c
第二个程序颠倒了两个变量:
int check_authentication(char *password) {
char password_buffer[16];
int auth_flag = 0;
strcpy(password_buffer, password);
...
}
作者随后提出,不可能将数据溢出到auth_flag中,这一点我本以为是正确的。然后我尝试进行缓冲区溢出,令我惊讶的是,它仍然起作用。正如您在此gdb输出中看到的那样,auth_flag变量仍然位于缓冲区之后:
gdb$ x/12x $esp
0xbffff400: 0xffffffff 0x0000002f 0xb7e0fd24 0x41414141
0xbffff410: 0x41414141 0x41414141 0x41414141 0x00000001
0xbffff420: 0x00000002 0xbffff4f4 0xbffff448 0x08048556
password_buffer @ 0xbffff40c
auth_flag @ 0xbffff41c
我想知道gcc是否会为了对齐/优化而重新排序局部变量。
我尝试使用-O0标志编译,但结果仍然相同。
你们中有人知道为什么会发生这种情况吗?
谢谢事先。