[英]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.