01. PWN基础知识
一.什么是溢出?
1.概念:在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据溢出
2.产生的原因:
*使用非安全类型(non -type-safe)的语言如C/C++等
*以不可靠的方式存取或者复制内存缓冲区
*编译器设置的内存缓冲区太靠近关键数据结构;
二.什么是PWN?
概念:
在计算机中,当要表示的数据超出计算机所使用的数据表示范围时,则产生数据的溢出。
“pwn”是一个黑客语法的俚语词,是指攻破设备或者系统。发音类似“砰”,对于黑客而言,这就是成功实施黑客攻击的声音—-砰的一声,被“黑”的电脑或手机就被操控。
三.复习寄存器
ESP: 用来储存函数调用得的栈顶指针,在压栈和退栈时发生变化
EBP: 用来存储当前函数状态的基地址,在函数运行时不变,可以用来索引确定函数参数或局部变量的位置
EIP: 用来储存即将执行的程序指令的地址
四.复习汇编
*32位x86架构下汇编指令有两种格式intel与AT&T
*Intel:寄存器名称和数值前无符号 AT&T:寄存器名称前加”%“,数值前加”$”
*在.gdbinit配置文件中可以配置:set disassembly-flavor intel
五.栈帧
栈帧就是一个函数执行的环境:函数参数、局部变量、函数执行后返回到哪里等等。每一个栈帧代表的就是一个未执行完的函数
ps: [ebp - xx]一般都是局部变量
[ebp + xx]一般都是参数
六.分析函数执行时堆栈变化
1. 在linux的控制台编译C文件
要求:熟悉Linux常用命令和Vi编辑器
首先进入root用户模式 sudo su:
ls 命令 显示文件目录:
命令cd 切换到指定目录:
1 | cd 桌面 |
命令mkdir 创建目录:
1 | mkdir PWN |
命令chmod 修改文件或目录权限:
1 | chmod 777 //最高权限 |
命令touch 创建相关文件:
1 | touch heilo.c |
进入Vi编辑器打开文本:
1 | vi hello.c |
之后按下 i 才能进行编辑,输入以下代码:
1 |
|
然后按Esc后输入 :wq 才能保存并且退出!
命令gcc 编译.c文件:
1 |
|
2. 运行gdb
1 | gdb hello |
1 | disass main 反汇编查看main函数 |
1 | disass test 查看test函数 |
1 | b *0x565554ed 加断点 |
1 | run 运行 |
这里即使到了我们的断点。
然后按 n 单步执行,注意观察堆栈变化:
push ebp就是把寄存器ebp的值,也就是ebp的地址压入堆栈中
mov ebp,esp就是把esp的地址传给epd,因ebp会上移动到esp所在的位置
sub esp,0x10就是把esp的地址减去了16字节,外观上看就是把esp上移了4行
call __x86.get_pc_thunk.ax 这个就先不管啦
add eax, 0x1ae4 也是先不管
mov edx, dword ptr [ebp + 8] 这个其实就是esp寻址,把参数1放到edx
mov eax, dword ptr [ebp + 0xc] 这个其实也是,把参数2放到eax
此时看的该是寄存器:
add eax, edx 把edx的值和eax相加后保存到eax
此时堆栈都还没发生变化,主要是在实现函数的主要功能
mov dword ptr [ebp - 4], eax 就是把eax存储的最后计算结果转存到堆栈中
mov eax, dword ptr [ebp - 4] 又把计算结果返回给EAX
1 | leave是汇编语言中用来关闭栈帧的指令名,通常用于函数末尾 |
ret 返回,把当前栈顶的值放入EIP,并且使栈顶指针加地址4默认,可以看到上面,esp储存的就是main函数内存地址
代码块跳转变化:
堆栈变化:
add esp, 8 平衡堆栈,esp+8,就是esp地址下移动8字节,两行
mov dword ptr [ebp - 4], eax 又是把eax的数据转存到堆栈
mov eax, 0 把eax清零
leave
ret 从main函数再返回就到结束阶段了,后面不解释
delete 最后删除所有断点
1 | 掌握函数调用的流程,以及函数调用约定, |