软件安全逆向——溢出漏洞
溢出漏洞
可了解
漏洞也称为脆弱性【Vulnerability】
缓冲区:一块连续的内存区域,用于存放程序运行时加载到内存的运行代码和数据
缓冲区溢出:程序运行时,向固定大小的缓冲区写入超过其容量的数据,多余的数据会越过缓冲区的边界覆盖相邻内存空间从而造成溢出
造成缓冲区溢出的根本原因:缺乏类型安全功能的程序设计语言(C\C++等)处于效率的考虑,部分函数不对数组边界条件和函数指针引用等进行边界检查。(未对缓冲区边界进行检查)
对于单字节溢出,必须利用其函数中首个变量
堆溢出漏洞
C语言中,堆通过malloc命令申请堆空间
1 | char bufchar[100]; |
因此构建输入字符串想溢出就要大于64字节,后面可自带一个自定义字符串,那么我们输入的buf1的内容就会覆盖掉buf2里的内容
异常处理结构体SEH
放在栈中构成单向链表,每个SEH有SEh链表指针和异常处理函数入口地址,共8个字节
SEH攻击
通过栈溢出或其他漏洞,使用构造数据覆盖SEH链表的入口地址、异常处理函数的入口地址等,以实现程序执行流程的控制。
异常处理函数的过程
1)线程初始化,向栈中自动装入SEH,作为线程默认的异常处理。若源代码中使用了异常处理机制,编译器将向当前函数栈帧中安装相应的SEH来实现异常处理;
2)异常发生,操作系统中断程序,从TEB中取出据栈顶最近的SEh,使用异常处理函数入口地址指向代码来处理异常,若失败则顺着链表依次尝试其他异常处理函数;
3)若装入的所有异常处理函数都失败了,则系统调用默认异常处理程序,若也处理不了则终结程序。
需掌握
栈溢出漏洞代码示例(可能考代码补全)
1 |
|
漏洞利用【实验考察】
对于一个输入7位密码(假定为1234567)的验证.exe(字符串截断符NULL会占一个字节,越界字符会覆盖掉原返回地址从而改变程序流程),实现的条件:
- 输入字符串大于”1234567”,因为
strcmp只有大于时返回1; - 输入字符应为8个字符,以使其覆盖返回变量的最低字节(1→0)。
- 在x32dbg中进入main函数,进入verify_password函数,在其输入密码的下一行设置断点,输入88888888即可成功爆破;
- 分析原因可发现执行完strcmp指令后,运行
mov dword ptr [ebp-4],eax语句将比较完的函数返回值赋给ebp-4的局部变量也就是返回变量,通过寄存器窗口观察当前EBP寄存器值【找到01 那个位置的地址是多少比如 0019FA08 01….】那么我们右键转到表达式,输入EBP-4即可观察到程序在执行了strcpy之后溢出成功使返回变量变为0.
第5章 结
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
