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