相关疑难解决方法(0)

堆栈上的局部变量分配顺序

看看这两个功能:

void function1() {
    int x;
    int y;
    int z;
    int *ret;
}

void function2() {
    char buffer1[4];
    char buffer2[4];
    char buffer3[4];
    int *ret;
}
Run Code Online (Sandbox Code Playgroud)

如果我打破function1()gdb,并打印变量的地址,我得到这个:

(gdb) p &x  
$1 = (int *) 0xbffff380
(gdb) p &y
$2 = (int *) 0xbffff384
(gdb) p &z
$3 = (int *) 0xbffff388
(gdb) p &ret
$4 = (int **) 0xbffff38c
Run Code Online (Sandbox Code Playgroud)

如果我做同样的事情function2(),我得到这个:

(gdb) p &buffer1
$1 = (char (*)[4]) 0xbffff388
(gdb) p &buffer2
$2 = (char (*)[4]) …
Run Code Online (Sandbox Code Playgroud)

c memory x86 stack gcc

26
推荐指数
4
解决办法
2万
查看次数

GCC如何决定输出汇编函数的顺序?

通过程序集GCC为我的项目中的C文件生成,我注意到函数不会按照它们在源文件中出现的顺序在汇编中输出.这次重新排序的目标是什么?GCC使用什么启发法来决定订单?(它只是保存函数的数据结构的工件吗?)这不是-freorder-functions,因为我没有使用-fprofile-arcs.

c gcc

13
推荐指数
1
解决办法
737
查看次数

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
查看次数

如何使用gcc工具链强制二进制函数的顺序?

我正在从几个源文件和库中构建一个静态二进制文件,我想控制函数放入生成的二进制文件的顺序.

背景是,我有外部代码链接到这个二进制文件中的偏移量.现在,如果我更改源,所有偏移都会改变,因为gcc可能决定以不同的方式对函数进行排序,所以我想以固定的顺序将引用的函数放在开头,这样它们的偏移量保持不变......

我查看了ld的文档,但找不到任何关于函数顺序的信息.

我发现的唯一的东西是-fno-toplevel-reorder,这对我没有帮助.

linker gcc gnu

7
推荐指数
2
解决办法
7943
查看次数

标签 统计

gcc ×4

c ×3

buffer-overflow ×1

gdb ×1

gnu ×1

linker ×1

memory ×1

reverse-engineering ×1

stack ×1

x86 ×1