经典栈溢出必备基础二进制安全:1. 至少掌握一种高级语言,含C。2. 熟悉x86/x64汇编。3. 熟悉OS的各个组件。4. 流畅的英文阅读能力。比起基础与天赋,更为重要的是: 敢于开始的勇气 + 持之以恒的毅力应用程序内存空间布局Linux x86的ELF内存布局:高1GB空间是内核所使用并由所有用户态应用程序共享的。栈自底向上增长,尺寸动态变化,默认临界大小是8M。Stack和mmap间有个随机偏移量用于防止栈溢出污染mmap。Mappings区间主要布置动态链接库。默认进程堆自顶向下增长。0始的低地址映射ELF各个节区成段。Note:Linux 2.6.7内核以前mmap方向相反X64的mmap方向也相反栈帧 = 局部变量 + 函数调用上下文栈是一种LIFO的数据结构。应用程序有一到多个用户态栈。栈自底向上增长,由指令PUSH和POP引起其动态变化。局部变量布局在栈中。调用函数时参数由栈传递,返回地址也存储于栈中。函数调用上下文与局部变量共同组成了栈帧——Stack Frame.栈帧实际上只是一个通俗的说法,关于栈帧的上下界历来有两种说法,一曰以EBP和ESP之间的栈空间视为栈帧,这也是主流说法;一曰以调用参数和ESP之间的栈空间视为栈帧,我个人更倾向于这种说法,因为它便于理解。函数调用过程中栈的变化经典栈溢出手法的应运而生追溯到1996年著名黑客杂志’p
原创力文档

文档评论(0)