gpt4 book ai didi

c - 反汇编c程序时神秘的printf参数

转载 作者:太空狗 更新时间:2023-10-29 17:03:35 25 4
gpt4 key购买 nike

所以我有这个 C 代码:

#include <stdio.h>

int main(void)
{
int a;
int b;
int c;

a=b=c=5;

printf("Hi%d%d%dHi",a,b,c);
}

我在 ubuntu 上编译它:

gcc program.c -o program -ggdb -m32 -O2

然后反汇编:

objdump -M intel program -d

在 main 中,printf() 被这样调用:

mov    DWORD PTR [esp+0x10],0x5
mov DWORD PTR [esp+0xc],0x5
mov DWORD PTR [esp+0x8],0x5
mov DWORD PTR [esp+0x4],0x8048500
mov DWORD PTR [esp],0x1
call 8048330 <__printf_chk@plt>

我现在想知道的是这意味着什么:

mov    DWORD PTR [esp],0x1

我知道前 4 条 mov 指令的用途,但我就是想不通为什么将“1”压入堆栈。此外,此移动仅在打开优化时发生。有什么想法吗?

最佳答案

GNU C 库 (glibc) 将使用 __printf_chk而不是 printf如果您(或编译器)定义了 _FORTIFY_SOURCE并启用优化。 _chk该函数的版本的行为就像它替换的函数一样,除了它应该是 check for stack overflow。并可能验证论点。额外的第一个参数表示应该进行多少检查和验证。

查看 actual glibc implmenation似乎没有对编译器自动提供的内容进行任何额外的堆栈检查(因此不需要),并且参数验证非常少。它将检查 %n只出现在只读格式字符串上,并检查是否特殊 %<i>m</i>$参数说明符用于所有参数,没有任何间隙。

关于c - 反汇编c程序时神秘的printf参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30277219/

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