PLT表与GOT表延迟绑定机制
Linux动态链接中的PLT和GOT动态链接和静态链接的简单理解可以理解为:如果文章引用了别人的一部分文字,把别人的段落复制到我的文章中·,就属于静态链接,动态链接就可以理解为给一个超链接让自己去看
PLT和GOTLinux下的动态链接是通过PLT & GOT实现的,使用测试代码test.c来进行理解
#include <stdio.h>void print_banner(){ printf("Welcome to World of PLT and GOT\n");}int main(void){ print_banner(); return 0;}
使用下列命令:
编译:gcc -Wall -g -o test.o -c test.c -m32
链接:gcc -o test test.o -m32
现在的Linux系统为x86_64系统,因为后续需要对中间文件test.o以及可执行文件test反编译,分析汇编指令,因此使用-m32来生成i386架构指令
通过objdump -d ...
Stack Overflow-中级ROP
Stack Overflow - 中级ROPret2csu原理
在64位程序中,函数的前六个参数是通过寄存器传递的,但是多数时候,不是很容易找到每一个寄存器对应的gadgets,这种情况下可以利用x64下的 __libc_csu_init 中的gadgets。 _libc_csu_init 一般来说,只要是调用了 libc.so 就会有这个函数来对 libc.so 进行初始化
rdi,rsi,rdx,rcx,r8,r9用来传递函数的前六个参数,多于六个就放到栈里
libc包含了许多常见的函数:strcpy、strlen、strcmp、malloc、free、sprintf、scanf、printf、fopen、fclose、read、write等
这是一段_libc_csu_init函数的汇编指令
.text:00000000004005A0 ; void _libc_csu_init(void).text:00000000004005A0 public __l ...
Stack Overflow - 基本ROP
Stack Overflow - 基本ROP保护机制
NX保护(DEP):栈上的数据没有执行权限,防止栈溢出和在栈上执行shellcode,实际上有了NX保护,堆、栈、bss段就没有执行权限了
canary保护(FS):函数开始时会随机产生一个值,这个值canary放在紧挨EBP的位置,当攻击者想要通过缓冲区溢出覆盖EBP和EBP下面的返回地址时,就会覆盖canary的值,程序结束以后,程序会检查canary这个值和之前的是不是一致,不一致就不往下运行,能够防止所有单纯的栈溢出
RELRO保护(ASLR):堆栈地址随机化,能够防止所有需要用到堆栈精确地址的攻击
PIE:代码地址随机化,防止构造ROP链攻击
基本ROP由于NX保护的开启,直接向堆或者是栈上注入代码的方式难以继续发挥效果,可以通过ROP来绕过保护,在栈缓冲区溢出的基础上,利用程序中已有的小片段 (gadgets) 来改变某些寄存器或者变量的值,从而控制程序的执行流程。gadgets就是以ret结尾的指令序列,通过这些指令序列能够修改某些地址的内容,方便控制程序的执行流程,核心在于利用了指令集中的 ret 指令,改变了指令 ...