一段C语言 反汇编代码,要求详解每句含义

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一段C语言 反汇编代码,要求详解每句含义相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
int main()
char *my[2];my[0] = “/bin/sh”;my[1] = NULL;
execve (my[0], my, NULL );

GDB输出:080481d0 <main>:
80481d0: 55 push %ebp
80481d1: 89 e5 mov %esp,%ebp
80481d3: 83 ec 08 sub $0x8,%esp
80481d6: 83 e4 f0 and $0xfffffff0,%esp
80481d9: b8 00 00 00 00 mov $0x0,%eax
80481de: 29 c4 sub %eax,%esp
......
80481fa: e8 f1 57 00 00 call 804d9f0 <__execve>
80481ff: 83 c4 10 add $0x10,%esp
8048202: c9 leave
8048203: c3 ret

0804d9f0 <__execve>:
804d9f0: 55 push %ebp
804d9f1: b8 00 00 00 00 mov $0x0,%eax
804d9f6: 89 e5 mov %esp,%ebp
804d9f8: 85 c0 test %eax,%eax
804d9fa: 57 push %edi
804d9fb: 53 push %ebx
804d9fc: 8b 7d 08 mov 0x8(%ebp),%edi
804d9ff: 74 05 je 804da06 <__execve+0x16>
804da01: e8 fa 25 fb f7 call 0 <_init-0x80480b4>
804da06: 8b 4d 0c mov 0xc(%ebp),%ecx
804da09: 8b 55 10 mov 0x10(%ebp),%edx
804da0c: 53 push %ebx
804da0d: 89 fb mov %edi,%ebx
804da0f: b8 0b 00 00 00 mov $0xb,%eax
804da14: cd 80 int $0x80
804da16: 5b pop %ebx
804da17: 3d 00 f0 ff ff cmp $0xfffff000,%eax
804da1c: 89 c3 mov %eax,%ebx
804da1e: 77 06 ja 804da26 <__execve+0x36>
804da20: 89 d8 mov %ebx,%eax
804da22: 5b pop %ebx
804da23: 5f pop %edi
804da24: c9 leave
804da25: c3 ret
804da26: f7 db neg %ebx
804da28: e8 cf ab ff ff call 80485fc <__errno_location>
...

请问 这几句代码 是做什么的
80481d6: 83 e4 f0 and $0xfffffff0,%esp
804da17: 3d 00 f0 ff ff cmp $0xfffff000,%eax
neg %ebx
4字节对齐?怎么不用nop之类的语句

我知道是比较,但它的作用是?
比如,开头那句sub exp..是分配栈空间

and $0xfffffff0,%esp 将esp和16进制的fffffff0进行与运算,
cmp $0xfffff000,%eax 将fffff000减去eax,但只改变标志位,而不影响两个数的大小,一般CMP指令后面会跟一个跳转指令,也可以说CMP指令是比较指令
neg %ebx 求EBX相反数的补码
nop指令的机器码是90,也就是空指令,不起作用的,sub $0x8,%esp这条指令是用于平衡堆栈的,如楼上所说,你可以当它是空气..有些汇编代码不用刻意去看懂,扫一眼知道是干什么用的就行了,有的就得仔细推敲它的含意和它起的作用
参考技术A 80481d6: 83 e4 f0 and $0xfffffff0,%esp
这一句是进行4字节对齐的,上一句sub esp... 是分配局部变量空间,其大小可能不是整4字节的,那样就会导致后面分配的变量以非4字节对齐的地址存放,导致性能降低,有这一句就好了。你可以当它是空气,不用管。

cmp $0xfffff000,%eax

这个是比较EAX的值是不是0xFFFFF000并置相应标志
参考技术B 汇编语言很复杂,现在很少人学 参考技术C 看后晕了

汇编指令中冒号(:)的未知含义

我正在使用反汇编程序(SmartDec:http://decompilation.info/),生成的反汇编中的许多指令看起来与此类似:

mov rax, [rip + 0x32b5]:64

我不熟悉这条指令的:64部分。这是什么意思?

其他例子:

cmp [rcx + r8 * 0x8]:64, 0x0
mov eax, [rip + 0x592a]:32
jmp [rip + 0x6bad]:64

这个反汇编程序没有显示相应的机器代码,因此我使用了一个十六进制编辑器并查找了它说该指令所在的地址:

1665:   mov rax, [rip + 0x19a4]:64

这就是Little Endian中有16个字节的内容:

54 00 00 49 89 E8 FF 15 DC 5F 00 00 E9 57 FF FF
答案

这是内存操作数的大小,无论出于何种原因打印。我从example on the SmartDec home page中推断出它的内容为movzx edx, [ecx]:16因此,这与其他汇编程序(或movzx edx, word [ecx])中的word ptr相当。只有在不能从其他操作数推导出大小时才有用,就像在这个movzx情况下一样。 SmartDec似乎每次都会展示它,例如对于你在问题中的例子,mov rax, [rip + 0x32b5]:64显然大小是64位所以它没有多大帮助。

以上是关于一段C语言 反汇编代码,要求详解每句含义的主要内容,如果未能解决你的问题,请参考以下文章

ida pro能反汇编成c语言吗

什么软件能将C语言的执行文件反汇编为汇编源代码

汇编与反汇编

将C语言代码转换成汇编语言,求帮忙,建议用反汇编软件的就不要来了,我试过,那个代码太多,不实用

C语言写的程序 怎么反汇编成汇编语言

反汇编区段加密代码