手动反编译asm片段
发布时间:2020-12-16 07:17:19 所属栏目:百科 来源:网络整理
导读:我一直在尝试反编译以下asm片段(这就是我所拥有的): 55 push %rbp48 89 e5 mov %rsp,%rbp48 81 ec d0 00 00 00 sub $0xd0,%rsp64 48 8b 04 25 28 00 mov %fs:0x28,%rax00 00 48 89 45 f8 mov %rax,-0x8(%rbp)31 c0 xor %eax,%eax48 c7 85 30 ff ff ff movq
我一直在尝试反编译以下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,%eax 48 8d b5 30 ff ff ff lea -0xd0(%rbp),%es:(%rdi) 48 8b 15 14 14 20 00 mov 0x201414(%rip),%rax be 2e 10 40 00 mov $0x40102e,%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}; sprintf(buf + 8,name); ……会给你输出. 您引用的movq指令在数组的开头存储0(8字节数量). -0xc8(%rbp)来自将字符串复制到数组中的偏移量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |