(原创)北京邮电大学网络空间安全 - 自主招生复试 CTF 题 wp
今年总共有三所院校自主招生里面提到了对网络空间安全特长生有高考优惠政策招生,分别是四川大学,北京邮电大学,中国科技大学。其中中国科技大学和北京邮电大学是降分到当地一本线录取,川大有三个等级,第一等级是降分到当地一本线录取,第二个等级是降分一本线下 30 分录取,第三个等级是破格录取,即不看高考分数录取。 因为在今年自招报名的时候,正好川大限制的报名院校数量是三所,所以我都报名了这三所学校。 最终的初审结果是通过了川大和北邮的初审,中国科技大学初审没通过(看来中科大对文化课成绩要求还是很高 -_-),其中,川大初审全国通过了三十多个人,北邮初审全国通过了七个人。 最终一番纠结还是选择了去北邮复试,于是乎高考考完英语下午就直奔北京参加考试去了,昨天回到克拉玛依,和同行的也通过了川大和北邮初审最终选择了北邮的好朋友 iosmosis 一同记录下这篇关于北邮自招复试的文章内容,希望能对有需要的小伙伴提供到帮助~ 值得一提的是北邮的最终复试,当天只有四个人到了现场,其中一个人选择的 ACM,我和剩下两人选择的 CTF。北邮复试分为上午机试(CTF 和 ACM 二选一)三小时,下午面试每个人大约十分钟时间,抽两个问题回答,和其他问题。
上午 CTF 内容(WEB 和 RE 各三道)
RE 下载链接
simple
这题还是比较简单的,首先直接 ida 打开。
通过下面的
我们便可以得出 flag 长度为 32 然后分析内部的操作。我们可显然可以看出算法核心就是对 flag 进行一堆骚操作之后与 v6 数组进行比较 ---> 遇见这种题目我们很容易想出使用 z3 约束进行求解 但是这里其实还有一个坑,他在骚操作的时候用了 uint8,而 uint8 的上限是 256,所以我们在写约束的时候要 %256. code 如下
from z3 import *
str1 = [
0x4f,0x3b,0x23,0x11,0xe1,0x1f,0xfe,0xb3,0x4b,0xdd,0x75,0xfe,0x47,0xec,0xf2,
0x43,0xdc,0x38,0xd4,0x64,0xde,0x45,0xbd,0x01,0x1b,0x04,0xb9,0x89,0x7d,0xb6,0x4e,0xe2]
str2 = [
0x6b,0x6e,0x26,0x54,0x56,0x4b,0xe8,0x80,0xdc,0x28,0x46,0x18,0x71,0xcb,0x65,0x44,0x9b,0x2b,0x22,0x82,0x2b,0x56,0x8e,0xe7,0x69,0x41,0x4c,0x1f,0x3a,0x45,0x5c,0x35]
flag = [BitVec("flag%d"%i,16) for i in range(32)]
S = Solver()
for i in range(32):
S.add(flag[i] > 32)
S.add(flag[i] < 128)
S.add((str2[i]^(((16*flag[i])|(flag[i]>>4))%256)) == str1[i])
if S.check() == sat:
m = S.model()
flag1 = ''
for i in range(32):
flag1 += chr(m[flag[i]].as_long())
print flag1
print flag1
运行得到 flag:
BUPT{Ea3y_3ncrypt1on_13n'T_it?!}
kaisa
依然直接 IDA 打开
结合 hint 很显然可以看出是凯撒加密,同时 v5=11,显然右移了 11 位,直接取出数据用工具暴力跑一波,得到 flag:
BUPT{Ka1_3A_I3_vERy_SmarT_R1Gni?!?}
*main
不会。。。。。
WEB
easyphp
右键查看网站源码
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<!--
index.php
<?php
$flag='xxx';
extract($_GET);
if(isset($gift)){
$content=trim(file_get_contents($flag));
if($gift==$content){
echo'flag';
}
else{
echo'flag has been encrypted';}
}
?>
-->
</body>
</html>
发现 hint 存在 flag 这个文件,读入到 content;输入 gift,如果 gift=content 则输出 flag。
尝试访问:http://10.112.163.9:8888/web2/index.php?gift=
返回:
Warning: file_get_contents(xxx): failed to open stream: No such file or directory in /var/www/html/web2/index.php on line 6
flag is OHCG{82s5r276o3006q2054048p6799op543q}
根据提示 flag has been encrypted,所以猜测 flag 被某种方式加密,猜测为凯撒加密,用工具爆破了一下:
PIDH{82t5s276p3006r2054048q6799pq543r}
QJEI{82u5t276q3006s2054048r6799qr543s}
RKFJ{82v5u276r3006t2054048s6799rs543t}
SLGK{82w5v276s3006u2054048t6799st543u}
TMHL{82x5w276t3006v2054048u6799tu543v}
UNIM{82y5x276u3006w2054048v6799uv543w}
VOJN{82z5y276v3006x2054048w6799vw543x}
WPKO{82a5z276w3006y2054048x6799wx543y}
XQLP{82b5a276x3006z2054048y6799xy543z}
YRMQ{82c5b276y3006a2054048z6799yz543a}
ZSNR{82d5c276z3006b2054048a6799za543b}
ATOS{82e5d276a3006c2054048b6799ab543c}
BUPT{82f5e276b3006d2054048c6799bc543d} //因为提示flag格式为BUPT{}因此此为flag
CVQU{82g5f276c3006e2054048d6799cd543e}
DWRV{82h5g276d3006f2054048e6799de543f}
EXSW{82i5h276e3006g2054048f6799ef543g}
FYTX{82j5i276f3006h2054048g6799fg543h}
GZUY{82k5j276g3006i2054048h6799gh543i}
HAVZ{82l5k276h3006j2054048i6799hi543j}
IBWA{82m5l276i3006k2054048j6799ij543k}
JCXB{82n5m276j3006l2054048k6799jk543l}
KDYC{82o5n276k3006m2054048l6799kl543m}
LEZD{82p5o276l3006n2054048m6799lm543n}
MFAE{82q5p276m3006o2054048n6799mn543o}
NGBF{82r5q276n3006p2054048o6799no543p}
OHCG{82s5r276o3006q2054048p6799op543q}
计算题
题目提示 1s 中回答随机产生的数学题,运算符号不发生改变,所以用 python 先取出需要运算的数然后进行运算,最后 post 提交即可。EXP 如下:
import urllib2, urllib
data = {'v' : '1'}
f = urllib2.urlopen(
url = 'http://10.112.163.9:8888/web1/index.php',
#data = urllib.urlencode(data)
)
res = f.readlines()
temp = str(res).split('<br/>')
print temp
res1 = temp[len(temp)-1]
print res1
temp = str(res1).split('=')
res2 = temp[len(temp)-6]
print res2
res = res2
re1 = str(res).split('*')
print re1
a = re1[len(re1)-3]
re2 = re1[len(re1)-2]
re2 = str(re2).split('+')
print re2
b = re2[len(re2)-2]
print b
q = int(a)*int(b)
print q //前两位相乘
c = re2[len(re2)-1]
print c
re3 = re1[len(re1)-1]
print re3
re3 = str(re3).split('(')
print re3
re3 = re3[len(re3)-1]
re3 = str(re3).split(')')
print re3
re3 = re3[len(re3)-2]
print re3
re3 = str(re3).split('+')
print re3
d = int(re3[len(re3)-2])+int(re3[len(re3)-1])
print d //括号里面的相加
p = int(c)*int(d)
print p //括号外相乘
ss = int(p)+int(q)
print ss //执行完整的运算
data = {'v' : ss}
f = urllib2.urlopen(
url = 'http://10.112.163.9:8888/web1/index.php',
data = urllib.urlencode(data)
)
print f.read()
运行即可获取 flag:
flag is BUPT{7b28f26afca4bc2654bd83d2a2bdc546}
author: Mr.R(https://darkeyer.github.io/
iosmosis(https://iosmosis.github.io/