gpt4 book ai didi

c - 手动反编译 asm 片段

转载 作者:太空狗 更新时间:2023-10-29 15:40:11 26 4
gpt4 key购买 nike

我一直在尝试反编译以下 asm 片段(我只有这些片段):

55                      push   %rbp
48 89 e5 mov %rsp,%rbp
48 81 ec d0 00 00 00 sub $0xd0,%rsp
64 48 8b 04 25 28 00 mov %fs:0x28,%rax
00 00
48 89 45 f8 mov %rax,-0x8(%rbp)
31 c0 xor %eax,%eax
48 c7 85 30 ff ff ff movq $0x0,-0xd0(%rbp)
00 00 00 00
48 8d b5 38 ff ff ff lea -0xc8(%rbp),%rsi
b8 00 00 00 00 mov $0x0,%eax
ba 18 00 00 00 mov $0x18,%edx
48 89 f7 mov %rsi,%rdi
48 89 d1 mov %rdx,%rcx
f3 48 ab rep stos %rax,%es:(%rdi)
48 8b 15 19 06 20 00 mov 0x200619(%rip),%rdx
48 8d 85 30 ff ff ff lea -0xd0(%rbp),%rax
be ce 0f 40 00 mov $0x400fce,%esi
48 89 c7 mov %rax,%rdi
b8 00 00 00 00 mov $0x0,%eax
e8 4e fc ff ff callq 4008a0 <sprintf@plt>

这是我的尝试:

char buf[192] = {0};
sprintf(buf, "hello %s", name);

我用 gcc 4.8.5 编译了它,它给了我:

55                      push   %rbp
48 89 e5 mov %rsp,%rbp
48 81 ec d0 00 00 00 sub $0xd0,%rsp
64 48 8b 04 25 28 00 mov %fs:0x28,%rax
00 00
48 89 45 f8 mov %rax,-0x8(%rbp)
31 c0 xor %eax,%eax
48 8d b5 30 ff ff ff lea -0xd0(%rbp),%rsi
b8 00 00 00 00 mov $0x0,%eax
ba 18 00 00 00 mov $0x18,%edx
48 89 f7 mov %rsi,%rdi
48 89 d1 mov %rdx,%rcx
f3 48 ab rep stos %rax,%es:(%rdi)
48 8b 15 14 14 20 00 mov 0x201414(%rip),%rdx
48 8d 85 30 ff ff ff lea -0xd0(%rbp),%rax
be 2e 10 40 00 mov $0x40102e,%esi
48 89 c7 mov %rax,%rdi
b8 00 00 00 00 mov $0x0,%eax
e8 cb fb ff ff callq 4008a0 <sprintf@plt>

我正在努力弄清楚为什么会这样:

movq   $0x0,-0xd0(%rbp)

以及随后使用 -0xd0(%rbp) 作为 sprintf 参数的指针。我很困惑,因为 rep stos 从 -0xc8(%rbp) 而不是 -0xd0(%rbp) 开始。

这可能是特定于编译器的,但我仍然很好奇生成该 asm 的原始代码可能是什么。

最佳答案

我想是这样的:

char buf[192] = {0, 0, 0, 0, 0, 0, 0, 0};
sprintf(buf + 8, "hello %s", name);

... 会给你那个输出。

您引用的 movq 指令在数组的开头存储 0(一个 8 字节的数量)。 -0xc8(%rbp) 来自将字符串复制到数组中的偏移量。

关于c - 手动反编译 asm 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com