这是我的功能的汇编代码。 这是使用gcc -O2 -fsanitize = undefined
运行的 0: 55 push %rbp
1: 53 push %rbx
2: 48 ba ff ff ff ff ff movabs $0x7fffffffffffffff,%rdx
9: ff ff 7f
c: 48 83 ec 08 sub $0x8,%rsp
10: 48 8b 1d 00 00 00 00 mov 0x0(%rip),%rbx # 17 <testovf+0x17>
17: 48 89 dd mov %rbx,%rbp
1a: 48 01 d5 add %rdx,%rbp
1d: 70 0d jo 2c <testovf+0x2c>
1f: 48 39 eb cmp %rbp,%rbx
22: 0f 9f c0 setg %al
25: 48 83 c4 08 add $0x8,%rsp
29: 5b pop %rbx
2a: 5d pop %rbp
2b: c3 retq
2c: 48 89 de mov %rbx,%rsi
2f: bf 00 00 00 00 mov $0x0,%edi
34: e8 00 00 00 00 callq 39 <testovf+0x39>
39: eb e4 jmp 1f <testovf+0x1f>
据我所知,当1a添加溢出时,它会跳到2c。 然而,在2c之后什么是mov%rbx,%rsi和mov $ 0x0,%edi呢? 他们需要在那里吗?
答案 0 :(得分:2)
在地址34
,您有一个callq
外部函数。您询问的两条指令设置了该函数的参数,根据标准的64位调用约定,它们在寄存器rdi
和rsi
中传递。
请注意,调用的目标显示为39 <testovf+0x39>
,但这不正确。有可能,你从objdump获得了这个列表,忘了使用-r
选项来显示重定位条目。