scanf 函数在哪个寄存器中存储输入值?
In which register does the scanf function store input values?
我对主函数进行了以下反汇编,其中使用 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“空闲”字节(分配在块中的第一条指令中),这就足够了space 为 6 个整数。 rsp
偏移量为0的是rsi
指向的,是mov指令调用后立即读取的值
我对主函数进行了以下反汇编,其中使用 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“空闲”字节(分配在块中的第一条指令中),这就足够了space 为 6 个整数。 rsp
偏移量为0的是rsi
指向的,是mov指令调用后立即读取的值