小编rge*_*han的帖子

gcc是否在编译时重新排序局部变量?

我现在正在阅读(第二次)"黑客攻击的艺术",并且偶然发现了一些事情.

本书提出了两种不同的方法来利用这两个类似的程序:auth_overflowauth_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)

c gcc gdb reverse-engineering buffer-overflow

9
推荐指数
1
解决办法
464
查看次数

标签 统计

buffer-overflow ×1

c ×1

gcc ×1

gdb ×1

reverse-engineering ×1