一、预备知识
1.汇编语言基础
汇编语言是能直接转换成机器语言的语言,由高级语言编译生成,不同体系架构的计算机所能执行的汇编语言不同。
(1)寄存器
| 寄存器名 | 说明 | 功能 |
|---|---|---|
| eax: | 累加器 | 加法乘法指令的缺省寄存器 |
| ecx: | 计数器 | REP&LOOP指令的内定计数器 |
| esp: | 栈顶指针寄存器 | SS:ESP当前堆栈的栈顶指针 |
| ebp: | 栈底指针寄存器 | SS:EBP当前堆栈的栈底指针 |
| eip: | 指令寄存器 | CS:EIP指向下一条指令的地址 |
(2)汇编指令
| 命令 | 解释 |
|---|---|
| PUSH | %esp -= 4; movl %REG, (%esp) |
| POP | movl (%esp), %REG; %esp += 4 |
| JMP | movl addr, %eip |
| CALL | pushl %eip; %eip =address; |
| RET | popl %eip |
2.Linux进程地址空间布局
- 程序通常包含代码块和数据块,这些代码和数据本身都是静态的
程序想要运行,首先要由操作系统负责为其创建进程,并在进程的虚拟地址空间中为其代码块和数据块建立映射
进程在运行过程中还要有静态环境,其中最重要的就是堆栈
- HighestZone:保存进程环境参数和进程参数
- 栈:存储函数参数、本地参数和栈状态变量,向低地址增长
- 堆:动态分配变量(malloc),向高地址增长
- .bss:未初始化的数据
- .test:指令,只读数据
二、示例代码
#include <stdio.h>
int function(int a,int b,int c){
char buffer[14];
int sum;
int *ret;
ret = (int*) (buffer +20);
(*ret)+=8;
sum = a+b+c;
return sum;
}
void main(){
int x;
x=0;
function(1,2,3);
x=1;
printf("%d\n",x);
}

本文介绍了C语言程序的汇编基础知识,包括Linux进程地址空间布局,详细阐述了从源代码到汇编代码的过程,以及如何在Mac环境下分析函数调用时的参数传递和堆栈操作。通过示例代码解析了如何利用缓冲区溢出修改返回地址以执行恶意代码,同时讨论了编译器保护机制如何防止此类攻击。
最低0.47元/天 解锁文章
1011

被折叠的 条评论
为什么被折叠?



