簡體   English   中英

scanf 函數將輸入值存儲在哪個寄存器中?

[英]In which register does the scanf function store input values?

我對 main 函數進行了以下反匯編,其中使用 scanf 函數(地址0x0000089c )存儲了用戶輸入。 由於進行了比較,我認為用戶輸入存儲在 rsp 寄存器中,但我不知道為什么,因為 rsp 似乎沒有被推入堆棧(至少,不在對 scanf 的調用附近功能)。 下面是拆解:

0x00000850 sub rsp, 0x18
0x00000854 mov rax, qword fs:[0x28]
0x0000085d mov qword [canary], rax
0x00000862 xor eax, eax
0x00000864 call fcn.00000a3c
0x00000869 lea rsi, str.Insert_input:
0x00000870 mov edi, 1
0x00000875 xor eax, eax
0x00000877 mov dword [rsp], 0
0x0000087e mov dword [var_4h], 0
0x00000886 call sym.imp.__printf_chk
0x0000088b lea rdx, [var_4h]
0x00000890 lea rdi, str.u__u  ; "%u %u" ;const char *format
0x00000897 xor eax, eax
0x00000899 mov rsi, rsp
0x0000089c call sym.imp.__isoc99_scanf ; int scanf(const char *format)
0x000008a1 mov eax, dword [rsp]
0x000008a4 cmp eax, 0x1336
0x000008a9 jg 0x867

在 x86_64 上,參數在寄存器中傳遞,因此您對 scanf 的調用將 3 個參數存儲在 3 個寄存器中:

  • rdi指向字符串"%u %u"的指針,要解析的格式(兩個無符號整數)
  • rsi應該是一個unsigned * ,指向放置第一個解析整數的位置
  • rdx指向放置第二個解析整數的位置的指針。

如果您在調用之前查看, rsi設置為rsp (堆棧指針),而rdx設置為指向全局變量var_4h (此處未定義的外部符號)。

堆棧用於保存局部變量,在這種情況下, rsp指向塊 0x18“空閑”字節(在塊中的第一條指令中分配),這對於 6 個整數來說是足夠的空間。 rsp偏移 0 處的那個是rsi所指向的,它是 mov 指令在調用后立即讀取的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM