所以我有这个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);
}
Run Code Online (Sandbox Code Playgroud)
我在ubuntu上编译它:
gcc program.c -o program -ggdb -m32 -O2
Run Code Online (Sandbox Code Playgroud)
然后将其拆解为:
objdump -M intel program -d
Run Code Online (Sandbox Code Playgroud)
并在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>
Run Code Online (Sandbox Code Playgroud)
我现在想知道的是这意味着什么:
mov DWORD PTR [esp],0x1
Run Code Online (Sandbox Code Playgroud)
我知道前4个mov指令的用途,但我无法弄清楚为什么'1'会被压入堆栈.此外,只有在打开优化时才会出现此mov.有任何想法吗?
如果你(或编译器)定义和优化被启用,GNU C库(glibc)将使用__printf_chk而不是.函数的版本就像它替换的函数一样,除了它应该检查堆栈溢出并且可能验证参数.额外的第一个参数表示应该进行多少检查和验证.printf_FORTIFY_SOURCE_chk
看看实际的glibc implmenation,似乎没有对编译器自动提供的内容进行任何额外的堆栈检查(因此不需要),并且参数的验证非常小.它将检查%n只出现在只读格式字符串上,并检查是否使用了特殊参数说明符,它们用于所有参数而没有任何间隙.%m$
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |