繁体   English   中英

c printf(“%x”),它打印什么?

[英]c printf(“%x”), what does it print?

我在 c 中键入此代码: __asm__("mov $10, %rsi"); printf("%x") __asm__("mov $10, %rsi"); printf("%x") ,它打印a .
我在gdb调试它,发现结果 store int register esi
问题:为什么结果是esi

printf("%x")尝试获取第二个参数,但它不存在,所以它只是读取它应该在的内存,找到那里的任何垃圾,然后打印出来。

简而言之:这是未定义的行为。

编辑:您看到与esi寄存器中的值相同的原因是因为System V AMD64 ABI (这是大多数 Unix 遵循的规范)在可能的情况下通过寄存器传递前几个参数。 第二个参数通过rsi传递,因此这就是printf读取的地方。

当调用printf("%x")时,它需要的参数被推入堆栈(以相反的顺序),并最终使用汇编命令call该函数。 当提供格式字符串"%x"printf()需要至少一个参数,因此它将读取堆栈上的下一个值,这可以是任何东西......
因此,这种行为实际上是未定义的,并且通常是漏洞利用的原因,因为您可能会破坏堆栈。

也许关于这个话题的一些演讲

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM