我现在正在阅读(第二次)"黑客攻击的艺术",并且偶然发现了一些事情.
本书提出了两种不同的方法来利用这两个类似的程序:auth_overflow和auth_overflow2
在第一个中,有一个像这样的密码检查功能
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[16];
strcpy(password_buffer, password);
...
}
Run Code Online (Sandbox Code Playgroud)
输入超过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
Run Code Online (Sandbox Code Playgroud)
第二个程序反转了两个变量:
int check_authentication(char *password) {
char password_buffer[16];
int auth_flag = 0;
strcpy(password_buffer, password);
...
}
Run Code Online (Sandbox Code Playgroud)
然后作者建议,不可能溢出到auth_flag,我真的相信.然后我继续溢出缓冲区,令我惊讶的是,它仍然有效.auth_flag变量仍然位于缓冲区之后,正如您在此gdb输出中看到的那样:
gdb$ x/12x $esp
0xbffff400: 0xffffffff 0x0000002f 0xb7e0fd24 0x41414141
0xbffff410: 0x41414141 0x41414141 0x41414141 0x00000001
0xbffff420: 0x00000002 0xbffff4f4 0xbffff448 0x08048556
password_buffer …Run Code Online (Sandbox Code Playgroud)