~/archive/entries / 0x01
0x01 初步认识C语言的运行

1 从加法开始
#include <stdio.h>
int add(int a, int b)
{
int result = a + b;
return result;
}
int main(void)
{
int x = 10;
int y = 20;
int sum = add(x, y);
printf("%d\n", sum);
return 0;
}一个平平无奇的C程序,我们今天从中开始拆解。
首先安装gcc、g++。如果有不懂的可以参考其他教程。
之后开始编译:
gcc -O0 -g -fno-omit-frame-pointer hello.c -o hello其中字段的含义:
- -O0:关闭优化,原样输出汇编
- -g:加入调试信息
- -fno-omit-frame-pointer: 保留栈帧
随后运行
./hello随之而来的输出就是:
x = 10
y = 20
sum = 30恭喜你,你已经在Linux上成功编译了一个C语言程序!
之后我们需要知道另一个指令file
file hello运行这个指令,你大概率会得到
hello: ELF 64-bit LSB pie executable, x86-64 ...这里有几个词你可能不清楚,一一告诉你:
ELF:Linux系统下的可执行文件,类似Win下的pe文件LSB:小端序PIE:程序加载地址可以随机化
2 汇编化
现在进入转为汇编语言:
sudo apt install objdumpobjdump -d -M intel hello | lessintel代表这是intel架构的CPU
好的,我们可以看到进入一个奇怪的编辑界面了,其实这和vi差不多,接下来输入
/add>:你可能会看到:
push rbp
mov rbp,rsp
mov DWORD PTR [rbp-0x14],edi
mov DWORD PTR [rbp-0x18],esi
mov edx,DWORD PTR [rbp-0x14]
mov eax,DWORD PTR [rbp-0x18]
add eax,edx
mov DWORD PTR [rbp-0x4],eax
mov eax,DWORD PTR [rbp-0x4]
pop rbp
retpush:pushmov:moveadd:add
先知道这三个最基础的汇编指令。
随后输入q退出输入界面。
好的,我们先不深入讲解C语言的汇编,先说下一个章节。
3 GDB
(未完待续)
No comments yet