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

来源:百度知道 编辑:UC知道 时间:2024/05/23 03:18:54
#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,%eb

and $0xfffffff0,%esp 将esp和16进制的fffffff0进行与运算,
cmp $0xfffff000,%eax 将fffff000减去eax,但只改变标志位,而不影响两个数的大小,一般CMP指令后面会跟一个跳转指令,也可以说CMP指令是比较指令
neg %ebx 求EBX相反数的补码
nop指令的机器码是90,也就是空指令,不起作用的,sub $0x8,%esp这条指令是用于平衡堆栈的,如楼上所说,你可以当它是空气..有些汇编代码不用刻意去看懂,扫一眼知道是干什么用的就行了,有的就得仔细推敲它的含意和它起的作用

汇编语言很复杂,现在很少人学

看后晕了

80481d6: 83 e4 f0 and $0xfffffff0,%esp
这一句是进行4字节对齐的,上一句sub esp... 是分配局部变量空间,其大小可能不是整4字节的,那样就会导致后面分配的变量以非4字节对齐的地址存放,导致性能降低,有这一句就好了。你可以当它是空气,不用管。

cmp $0xfffff000,%eax

这个是比较EAX的值是不是0xFFFFF000并置相应标志