Function 在汇编中传递参数

Function 在汇编中传递参数,function,assembly,parameters,objdump,Function,Assembly,Parameters,Objdump,我有个问题需要帮助。我应该检测这个问题的密码(答案),这是汇编中的参数之一 输出: 在这个级别中,您将需要使用gdb来查找原样的密码 作为参数传递给具有6个参数的函数。对于x86-64, 使用寄存器传递参数的助记符是Diane的丝绸连衣裙 花费89美元。(rdi rsi rdx rcx r8 r9) 输入密码: 我相信函数的objdump代码有6个参数-- 0000000000 4006A1: 4006a1:55%按需付费 4006a2:48 89 e5 mov%rsp,%rbp 4006a5:

我有个问题需要帮助。我应该检测这个问题的密码(答案),这是汇编中的参数之一

输出:

在这个级别中,您将需要使用gdb来查找原样的密码 作为参数传递给具有6个参数的函数。对于x86-64, 使用寄存器传递参数的助记符是Diane的丝绸连衣裙 花费89美元。(rdi rsi rdx rcx r8 r9)

输入密码:

我相信函数的objdump代码有6个参数--

0000000000 4006A1:
4006a1:55%按需付费
4006a2:48 89 e5 mov%rsp,%rbp
4006a5:53推送%rbx
4006a6:48 83 ec 48子$0x48,%rsp
4006aa:48 89 7d d8 mov%rdi,-0x28(%rbp)
4006ae:48 89 75 d0移动%rsi,-0x30(%rbp)
4006b2:48 89 55 c8 mov%rdx,-0x38(%rbp)
4006b6:48 89 4d c0 mov%rcx,-0x40(%rbp)
4006ba:4c 89 45 b8 mov%r8,-0x48(%rbp)
4006be:4c 89 4d b0 mov%r9,-0x50(%rbp)
4006c2:c7 45 e4 01 00动产$0x1,-0x1c(%rbp)
4006c9:48 8b 45 c0 mov-0x40(%rbp),%rax
4006cd:48 89 c7 mov%rax,%rdi
4006d0:e8 5b fe ff ff callq 400530
4006d5:89 45 ec mov%eax,-0x14(%rbp)
4006d8:8b 45 ec mov-0x14(%rbp),%eax
4006db:48 63 d8 movslq%eax,%rbx
4006de:48 8b 45 b0 mov-0x50(%rbp),%rax
4006e2:48 89 c7 mov%rax%rdi
4006e5:e8 46 fe ff ff callq 400530
4006ea:48 39 c3 cmp%rax,%rbx
4006ed:74 07 je 4006f6
4006ef:c7 45 e4 00动产$0x0,-0x1c(%rbp)
4006f6:c7 45 e8 00移动$0x0,-0x18(%rbp)
4006fd:eb 31 jmp 400730
4006ff:8b 45 e8 mov-0x18(%rbp),%eax
400702:48 63 d0 movslq%eax,%rdx
400705:48 8b 45 b8 mov-0x48(%rbp),%rax
400709:48 01 d0添加%rdx,%rax
40070c:0f b6 10 movzbl(%rax),%edx
40070f:8b 45 e8 mov-0x18(%rbp),%eax
400712:48 63 c8 movslq%eax%rcx
400715:48 8b 45 b0 mov-0x50(%rbp),%rax
400719:48 01 c8添加%rcx,%rax
40071c:0f b6 00 movzbl(%rax),%eax
40071f:38 c2 cmp%al,%dl
400721:74 09 je 40072c
400723:c7 45 e4 00动产$0x0,-0x1c(%rbp)
40072a:eb 0c jmp 400738
40072c:83 45 e8 01地址$0x1,-0x18(%rbp)
400730:8b 45 e8 mov-0x18(%rbp),%eax
400733:3b 45 ec cmp-0x14(%rbp),%eax
400736:7c c7 jl 4006ff
400738:8b 45 e4 mov-0x1c(%rbp),%eax
40073b:48 83 c4 48添加$0x48,%rsp
40073f:50亿英镑现金%rbx
400740:5d pop%rbp
400741:c3 retq
我相信从4006aa到4006be是参数。然而,当我逐个输入这些寄存器的值作为答案时,它说这不是正确的答案(例如,-0x28)。我试着用十进制、十六进制和二进制输入答案。我使用gdb调试它,打印出函数中的6个参数寄存器,并单独使用这些值作为答案,它也不起作用。我卡住了。我能就如何解决这个问题提供一些指导吗

请注意,对于这个问题,我无法访问c代码,也无法访问由人工编写的汇编代码。只有objdump代码和可执行文件


如果你们想亲自尝试帮助我的话,这里有一个可执行文件:callq 400530调用一个函数来确定字符串的长度。它使用与函数相同的调用约定,在RDI中使用
const char*
arg。从第4个函数arg开始,在此处设置:

4006b6: mov %rcx,-0x40(%rbp)
4006c9: mov -0x40(%rbp),%rax
4006cd: mov %rax,%rdi
此C标准库函数返回
rax
中字符串的大小。您的函数取其低位32位,并将其符号扩展到
rbx
(可能源代码是
int len=strlen(arg4);
):

4006de
4006e5
时,使用设置在
4006be:mov%r9,-0x50(%rbp)
的另一个字符串再次执行相同的过程,在第二次调用后,函数比较长度:

4006ea: cmp %rax,%rbx
我的猜测是,其中一个字符串是您正在查找的密码,另一个是您输入的字符串。只需在
4006a1
处暂停执行,用
info registers
打印寄存器,用
x/s
查看
rcx
r9


或者,如果此函数的调用者将您的输入解析为多个字符串参数,可能使用
scanf
,则这两个单词的长度必须相同。

4006e5:callq 400530
调用函数以确定字符串的长度。它使用与函数相同的调用约定,在RDI中使用
const char*
arg。从第4个函数arg开始,在此处设置:

4006b6: mov %rcx,-0x40(%rbp)
4006c9: mov -0x40(%rbp),%rax
4006cd: mov %rax,%rdi
此C标准库函数返回
rax
中字符串的大小。您的函数取其低位32位,并将其符号扩展到
rbx
(可能源代码是
int len=strlen(arg4);
):

4006de
4006e5
时,使用设置在
4006be:mov%r9,-0x50(%rbp)
的另一个字符串再次执行相同的过程,在第二次调用后,函数比较长度:

4006ea: cmp %rax,%rbx
我的猜测是,其中一个字符串是您正在查找的密码,另一个是您输入的字符串。只需在
4006a1
处暂停执行,用
info registers
打印寄存器,用
x/s
查看
rcx
r9


或者,如果此函数的调用者将您的输入解析为多个字符串参数,可能使用
scanf
,那么这两个单词的长度必须相同。

这是一个有趣的助记符。我记得x86-64 SysV调用约定的方式是,arg的设置使得
memcpy
可以内联为
rep