CSAPP学习笔记-缓冲区溢出(AttackLab前言)

缓冲区溢出

向程序缓冲区写入超出其长度的内容,造成缓冲区溢出,造成程序破坏以执行其他程序,达到攻击目的

导致溢出的函数:strcpy()、strcat(),sprintf(),vsprintf(),gets(),scanf()

通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令(获得root权限)

1在地址空间安排代码

2初始化寄存器和内存,让程序跳转到想要的位置

ctarget-代码注入(对应前1-3个实验—ctarget)

rtarget ROP攻击-修改返回值(对应后两个lab—rtarget)

金丝雀值

金丝雀值:由于c不会对数组长度进行检测,但采取金丝雀值方式解决,将金丝雀值插入,数组操作结束后检查金丝雀值是否发生变化,若变化则禁止程序运行。 

金丝雀值位置:高于局部变量,比栈底低(栈从高到低),低于返回值

函数比局部变量更高的地址被修改,返回地址更低

[pwn基础]Linux安全机制 - 自由资讯

在程序启动时随机生成并且保存在比函数返回地址更低的位置。(栈溢出就是为了覆盖返回地址),由于覆盖到返回地址,那不可避免的会覆盖到这个随机数(Cannary),程序在函数返回前,检查下Cannary是否被覆盖从而判断是否被栈溢出,从而达到保护栈的目的。

CSAPP学习笔记-缓冲区溢出(AttackLab前言)_第1张图片

蠕虫病毒

蠕虫病毒:直接修改返回地址

蠕虫和金丝雀

对抗缓冲区溢出

1栈随机化

(1)入侵者为了在系统中插入代码并确保被插入的代码会被执行,他们除了要插入恶意代码,还需要插入指向这段代码的指针,这个指针也是攻击字符串的一部分。

    产生这个指针需要知道攻击字符串会放置到栈的哪个位置,也就是得到相应的栈地址。如果栈的位置过于固定,那么攻击者很容易就可以确定一个常见的Web服务器所使用的栈空间的具体信息,这使得攻击者可以对相同的很多机器发起攻击;

(2)栈随机化的思想就是使得栈的位置在程序每次运行的时候都会有所变化,因此即使在很多相同的机器上都运行相同的代码的时候,他们所得到的栈地址也是不尽相同的。

    实现栈随机化的方法是:每当程序开始的时候都会在栈上分配一段0~n字节之间的随机大小的空间,而程序并不使用这段空间,这样就会导致程序在每次执行时后续的栈位置发生了变化。

2栈破坏检测

c语言使用金丝雀

CSAPP学习笔记-缓冲区溢出(AttackLab前言)_第2张图片

你可能感兴趣的:(CSAPP,操作系统,学习,笔记,linux)