簡體   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