长亭科技 栈溢出

Shellcode

修改返回地址,让其指向溢出数据段的一段指令

构造shellcode

确定返回地址前的数据填充;
确定shellcode的起始地址;0x90 nop填充,来进行滑雪橇
NOP Sled 滑雪橇方法;

内存布局随机化技术,ASLR

实现shellcode:在函数调用栈上的数据要有可执行权限,并关闭内存地址布局随机化;

Return2libc

修改返回地址,让其指向内存中已有的某个函数
在内存中确定某个函数的地址,并用其覆盖掉返回地址;
libc动态链接库中的函数被广泛使用,可以大概率在内存只能够找到该动态库;
libc中包含系统级函数;
可以利用系统级函数来获得当前进程的控制权;
执行函数可能会含有参数,溢出数据也要包括必要的参数;

return2libc的构造

返回地址前的数据填充问题;
libc中函数的地址是多少;

eax 累加寄存器
ebx 基址寄存器
ecx 计数寄存器
edx 数据寄存器

edi esi 作为索引寄存器 esi指向要处理的数据地址 edi指向存放处理结果的数据地址

代码段存储可执行代码和只读常量 可读可执行 通常不可写
数据段存储已经初始化且初值不为0的全局变量和静态局部变量 可写
BSS段存储未初始化或初值为0的全局变量和静态局部变量 可写

汇编指令格式

inter: 寄存器名称和数值前无符号. 指令名称 目标操作数 源操作数
AT&T:寄存器前有% 数值前有$ 指令名称 源操作数 目标操作数

ROP

修改返回地址,让其指向内存中已有的一段指令
在内存中确定某段指令的地址,并用其覆盖返回地址
不同于retuen2libc 有时目标函数在内存中无法找到,目标操作数并没有特定的函数可以完美适配 这时就需要在内存中寻找多个指令片段,拼凑出一系列操作来达成目的
执行某段指令 gadget

返回导向编程:执行多个gadget,每个gadget执行完毕后可以将控制权交给下一个gadget,则gadget的最后一步应该是ret指令

posted @ 2020-03-19 10:16  小哑师兄  阅读(132)  评论(0)    收藏  举报