栈溢出原理及解题练习

本文介绍了栈溢出的基本概念、内存区域、函数调用过程以及寄存器作用。通过解析汇编语言中的寻址方式,深入理解栈溢出漏洞的产生原因。通过实际解题案例,展示了如何利用栈溢出漏洞,包括覆盖返回地址和修改临接变量,最终实现程序控制流的篡改。文章还探讨了64位可执行文件的安全保护措施,如RELRO,并给出了利用exploit进行漏洞利用的示例。
摘要由CSDN通过智能技术生成

PWN学习任务二:

内容:
1.栈溢出学习 地址CTF-WIKI
2.完成栈溢出题目
要求:解题步骤写在博客

解题准备:

按题设要求,查看CTF-Wiki相关内容,云里雾里,没有基础知识,看了好久都看不懂:

基本栈介绍
栈是一种典型的先进后出( First in Last Out )的数据结构,其操作主要有压栈(push)与出栈(pop)两种操作,如下图所示(维基百科)。两种操作都操作栈顶,当然,它也有栈底。
高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了这一数据结构。每个程序在运行时都有虚拟地址空间,其中某一部分就是该程序对应的栈,用于保存函数调用信息和局部变量。此外,常见的操作也是压栈与出栈。需要注意的是,程序的栈是从进程地址空间的高地址向低地址增长的。

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。这种问题是一种特定的缓冲区溢出漏,类似的还有堆溢出,bss 段溢出等溢出方式。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是:程序必须向栈上写入数据;写入的数据大小没有被良好地控制。

于是转而去智慧树看了基础知识:笔记如下:
兴趣课链接 攻防基础:漏洞利用及渗透测试.

堆栈基础1-内存区域

一个进程可能被分配到不同的内存区域去执行
代码区:这个区域存储着被装入执行的二进制机器代码,处理器会到这个区域取指令并执行
数据区:存储全局变量等
堆区:进程可以在堆区动态地请求一定大小的存,并在用完之后归还给堆区。动态分配和回收是1堆区的特点
栈区:用于动态地存储函数之间地关系,以保证被调用函数在返回时回复到母函数中继续执行-由操作系统管理

一个进程到底是怎么对内存区域合理执行的:
每个可执行文件包含了二进制级别的机器代码,将被装载到内存的代码区;
处理器将到内存的代码区一条一条地取指令和操作数,并送入算术逻辑单元进行运算;
如果代码中需要请求动态内存,则会在内存的堆区分配一块大小合适的区域返回给代码区的代码使用;
当函数发生调用时,函数的调用关系等信息会动态保存在内存的栈区,以供处理器在执行完被调用函数的代码时,返回母函数。

(stack)是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的。在WINDOWS下,栈的默认大小是2M,如果申请的空间超过栈的剩余空间时,将提示:overflow。栈溢出。
(heap)时向高地址扩展的结构,是不连续的内存区域,堆的大小受限于计算机的虚拟内存。通常比栈的大小大得多。

操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表:
1.寻找第一个空间大于所申请空间的队堆节点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
2.由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

堆区和栈区的区别:
申请方式:
栈:由系统自动分配。例如,声明一个局部变量int b,系统自动在栈中为b开辟空间。
堆:需要程序员自己申请,并指明大小,在c中malloc函数,如p1=(char*)malloc(10).
申请效率:
栈由系统自动分配,速度较快,但程序员是无法控制的。
堆是由程序员分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。

堆栈基础2.-函数调用

函数调用时借用系统的栈来完成函数状态的保存和恢复
这些代码区中精确的跳转都是在系统栈巧妙地配合过程中完成的
当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中
每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。
当函数返回时,系统栈会弹出该函数所对应的栈帧。

函数调用的步骤
(1)参数入栈:将参数从右向左依次压入系统栈中。
(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。
(3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。
(4)栈帧调整:具体包括:保存当前栈帧状态值,以备后面恢复本栈帧时使用。将当前栈帧切换到新栈帧

堆栈基础3-常见寄存器与栈帧

寄存器:是中央处理器CPU的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指数据和地址。我们常常看到32位CPU、64位CPU这样的名称,其实指

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值