二进制安全:经典栈溢出手法笔记总结
Posted 鸿渐之翼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制安全:经典栈溢出手法笔记总结相关的知识,希望对你有一定的参考价值。
二进制安全基础概念
应用程序内存空间布局
Linux x86的ELF内存布局:
高1GB空间是内核所使用并由所有用户态应用程序共享的。
栈自底向上增长,尺寸动态变化,默认临界大小是8M。
Stack和mmap间有个随机偏移量用于防止栈溢出污染mmap。
Mappings区间主要布置动态链接库。
默认进程堆自顶向下增长。
0x08048000开始的低地址映射ELF各个节区成段。
Linux 2.6.7内核以前mmap方向相反
X64的mmap方向也相反
经典栈溢出手法的应运而生
追溯到1996年著名的黑客杂志‘‘phrack’’第49期刊载的一篇文章:《Smashing The Stack for Fun and Profit》
经典栈溢出的手法概要:
1.先决条件:栈的局部变量可控,存在溢出(strcpy)
2.通过栈空间精心布局,布置shellcode,并用shellcode初始地址覆盖栈帧stack frame的ret addr。
3.Payload =[Nop sled +]Shellcode + Pad +Shellcode’s Addr
存在问题
1.Shellcode的地址在不同PC上不确定
2.每次运行地址都会变化(ALSR保护机制)
栈帧 = 局部变量 + 函数调用上下文
栈是一种LIFO的数据结构。
应用程序有一到多个用户态栈。
栈自底向上增长,由指令PUSH和POP引起其动态变化。
局部变量布局在栈中。
调用函数时参数由栈传递,返回地址也存储于栈中。
函数调用上下文与局部变量共同组成了栈帧——Stack Frame.
栈帧实际上只是一个通俗的说法,关于栈帧的上下界历来有两种说法,一曰以EBP和ESP之间的栈空间视为栈帧,这也是主流说法;一曰以调用参数和ESP之间的栈空间视为栈帧,我个人更倾向于这种说法,因为它便于理解。
以上是关于二进制安全:经典栈溢出手法笔记总结的主要内容,如果未能解决你的问题,请参考以下文章
《有趣的二进制:软件安全与逆向分析》读书笔记:利用软件的漏洞进行攻击
《有趣的二进制:软件安全与逆向分析》读书笔记:利用软件的漏洞进行攻击