第一次练习,可能有错误的地方。
最近在学习(打发时间)逆向方面的知识
#C源代码 下面是main.c的代码
#include <stdio.h>
int function(int i,int *j)
{
char ch='A';
int a=char array[]="abc";
char array[]="abc";
b=i+(*j)+a;
return b;
}
void main()
{
int i=6,j=4;
function(i,&j);
}
对上面代码进行编译gcc -g main.c -o main.out
下面我们来用gdb反编译main.out文件 得到其main和function的汇编指令如下
0x00000000004004eb <+0>: push rbp
0x00000000004004ec <+1>: mov rbp,rsp
0x00000000004004ef <+4>: sub rsp,0x10
0x00000000004004f3 <+8>: mov DWORD PTR [rbp-0x4],0x6
0x00000000004004fa <+15>: mov DWORD PTR [rbp-0x8],0x4
0x0000000000400501 <+22>: lea rdx,[rbp-0x8]
0x0000000000400505 <+26>: mov eax,DWORD PTR [rbp-0x4]
0x0000000000400508 <+29>: mov rsi,rdx
0x000000000040050b <+32>: mov edi,eax
0x000000000040050d <+34>: call 0x4004b6 <function>
0x0000000000400512 <+39>: leave
0x0000000000400513 <+40>: ret
0x00000000004004b6 <+0>: push rbp
0x00000000004004b7 <+1>: mov rbp,rsp
0x00000000004004ba <+4>: mov DWORD PTR [rbp-0x14],edi
0x00000000004004bd <+7>: mov QWORD PTR [rbp-0x20],rsi
0x00000000004004c1 <+11>: mov BYTE PTR [rbp-0x1],0x41
0x00000000004004c5 <+15>: mov DWORD PTR [rbp-0x8],0x5
0x00000000004004cc <+22>: mov DWORD PTR [rbp-0x10],0x636261
0x00000000004004d3 <+29>: mov rax,QWORD PTR [rbp-0x20]
0x00000000004004d7 <+33>: mov edx,DWORD PTR [rax]
0x00000000004004d9 <+35>: mov eax,DWORD PTR [rbp-0x14]
0x00000000004004dc <+38>: add edx,eax
0x00000000004004de <+40>: mov eax,DWORD PTR [rbp-0x8]
0x00000000004004e1 <+43>: add eax,edx
0x00000000004004e3 <+45>: mov DWORD PTR [rbp-0xc],eax
0x00000000004004e6 <+48>: mov eax,DWORD PTR [rbp-0xc]
0x00000000004004e9 <+51>: pop rbp
0x00000000004004ea <+52>: ret
#最后内存中的情况如下图
如果有分析错误请别打我