我對 main 函式進行了以下反匯編,其中使用 scanf 函式(在 address 處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
uj5u.com熱心網友回復:
在 x86_64 上,引數在暫存器中傳遞,因此您對 scanf 的呼叫將 3 個引數存盤在 3 個暫存器中:
rdi指向字串的指標"%u %u",要決議的格式(兩個無符號整數)rsi應該是一個unsigned *, 指向放置第一個決議整數的位置的指標rdx指向放置第二個決議整數的位置的指標。
如果您在呼叫之前查看,rsi設定為rsp(堆疊指標),而rdx設定為指向全域變數var_4h(此處未定義外部符號)。
堆疊用于保存區域變數,在這種情況下,rsp指向塊 0x18“空閑”位元組(在塊中的第一條指令中分配),這對于 6 個整數來說是足夠的空間。偏移量 0 fromrsp的那個是rsi指向的東西,它是 mov 指令在呼叫后立即讀取的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486322.html
上一篇:emu8086中的大陣列定義問題
下一篇:鏈接前用匯編語言呼叫函式
