栈溢出(PWN)学习笔记

本文深入探讨栈溢出的概念,包括栈的内存布局、Linux内存组织方式和栈溢出漏洞的原理。文章详细分析了栈溢出漏洞的利用,如程序保护机制(如CANNARY、NX、PIE、RELRO)及其绕过技巧,并介绍了如何编写shellcode和使用ROP技术。此外,还讲解了编写EXP(漏洞利用脚本)的技巧,如使用python的pwntools库。
摘要由CSDN通过智能技术生成

一、栈简介

数据结构中的栈

数据结构中的栈就是在表尾进行插入和删除操作的线性表。可以进行插入(push)和删除(pop)的一端称做为栈顶,栈底是固定不变的一端,空栈是什么数据都没有的栈。栈是一种后进先出的数据结构,先放入的数据最后取出,最后放入栈的数据,最先取出。
在这里插入图片描述
数据结构中的栈定义了一些操作。最重要的是PUSH和POP。PUSH操作是在栈顶部压入一个数据,并将栈顶的值加一。POP操作在栈顶部弹出一个数据,栈内删掉一个数据,并将栈顶的值减一。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

linux内存布局

Kernel Space:Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。在设计时考虑到安全因素,内核空间和用户用户是隔离的,即使用户的程序崩溃了,内核也不受影响。
Stack:Linux中的栈与数据结构中的栈类似,是计算机程序中非常重要的理论之一,可以说没有一个程序程序可以离开这种结构栈。用户或者程序都可以把数据压入栈中,不管如何栈始终有一个特性:先入栈的数据最后出栈(First In Last Out, FIFO)。
Heap:堆相对相对与栈来说比较复杂,编程人员在设计时程序可能会申请一段内存,或者删除掉一段已经申请过的内存,而且申请的大小也不确定,可以是从几个字节,也可以是数 GB ,所以堆的管理相对来说比较复杂。
bss段:BSS段通常是一块内存区域用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的。特点是可读写的,程序初始化时会自动清零。
Data段:数据段是一块内存区域它用来存放程序中已初始化的全局变量的。数据段是静态内存分配。
Code段:代码段是一块内存区域来存放程序执行代码的。代码段在程序运行前就已经确定,代码段在内存中是一段只读空间,但有些架构也允许代码段可读写,即允许自修改程序。
在这里插入图片描述

操作系统内存组织方式(栈)

计算机使用内存用来装载要将要运行的代码和程序运行时的数据。操作系统在运行中将内存分为两个互不干扰且独立的区域,每个区域内存的组织方式时不同的,这两个独立的区域我们称为栈和堆。栈和堆的设计目标完全不同。在程序调用函数时,程序的参数和局部变量都是从栈中获取。当调用完程序后,会正常返回到上一层,或者抛出异常,为函数参数和局部变量分配的内存空间会自动收回,之后还可被别的程序使用。内存中栈的方法参数和局部变量均有生存期,调用程序时生存期开始,调用程序结束后生存期结束。在C语言中使用malloc关键字创建堆,这是就会在内存中开辟一个堆空间,堆是引用变量,可以在同一个程序不同的位置引用堆内存。使用堆内存要刻意删除,内存中的堆才可以消失。
在这里插入图片描述
在mian()函数中,调用了test()函数,这样操作系统就会为程序开辟一个栈。我们来反汇编关键代码,了解操作系统是如何为程序开辟栈的,以及开辟栈的过程。

PWN是一种以攻破计算机系统中的漏洞为目的的竞赛类型,参赛者需要利用漏洞进行攻击并获取系统权限。在ctfshow PWN中,栈溢出是一种常见的攻击方式。 根据提供的引用,我了解到栈溢出是一种通过向程序输入过长的数据导致数据溢出栈的一种攻击手段。栈是一种数据结构,用于存储程序的局部变量和函数调用的返回地址等信息。当程序接收到超出栈空间大小的数据时,溢出的数据会覆盖到栈上的其他数据,从而可能改变程序的执行流程。 根据引用,在ctfshow PWN中,参赛者可以利用栈溢出漏洞来控制程序的执行流程。通过向程序输入特制的数据,可以覆盖控制流中的返回地址,使程序跳转到攻击者精心构造的代码,从而达到获取系统权限的目的。 具体来说,参赛者可以通过向程序发送超出预期的数据,覆盖栈上的返回地址,使其指向攻击者准备好的恶意代码,从而实现栈溢出攻击。攻击者可以利用此漏洞来执行任意代码,包括获取系统权限、执行恶意操作等。 引用和引用提供了一些示例代码,演示了如何利用栈溢出漏洞进行攻击。这些代码使用Python的pwn库来与目标程序进行交互,并通过构造特制的payload来触发栈溢出漏洞,最终实现控制程序执行流程的目的。 需要注意的是,栈溢出是一种非常危险的漏洞,合法的程序设计应该避免出现此类问题。在实际应用中,为了防止栈溢出攻击,开发者需要加强输入验证和数据处理等安全机制。 总结起来,ctfshow PWN栈溢出是一种通过向程序输入过长数据导致栈溢出的攻击方式,在该竞赛中常用于获取系统权限和执行恶意操作。攻击者可以利用漏洞覆盖返回地址,使程序执行恶意代码。然而,栈溢出是一种危险的漏洞,合法的程序设计应该避免此类问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ctfshow pwn4](https://blog.csdn.net/qq_39980610/article/details/126461902)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ctfshow pwn5](https://blog.csdn.net/qq_39980610/article/details/126462163)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高木正雄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值