大赛由中共广州市委网络安全和信息化委员会办公室作为指导单位,广州市网络安全产业促进会主办,广东外语外贸大学、深信服科技股份有限公司承办,广州市信息安全测评中心、广州互联网协会协办。
大赛以“网络安全为人民、网络安全靠人民”为主题,旨在通过竞赛的方式提高参赛选手攻防兼备的网络安全实践技能,实现以赛促学、以赛会友,加强不同院校及单位间的技术交流。
Rank: 企事业单位组12
Reverse
Ez_android
Just an easy sign in!
jadx查看MainActivity
类。
onClink
函数先验证username和password,在资源文件查到username为admin
,加密处理后的password值为c232666f1410b3f5010dc51cec341f58
,又getEncodeStr
函数对password的md5结果每一byte做了减1处理,还原得到c33367701511b4f6020ec61ded352059
,查到对应的原值为654321
。
接下来执行getKeyAndRedirect
函数,传入password值654321
,进入socket交互(nc 139.224.191.201 20080
),输入password,拿到key字符串:
key=TGtUnkaJD0frq61uCQYw3-FxMiRvNOB/EWjgVcpKSzbs8yHZ257X9LldIeh4APom
在getKeyAndRedirect
函数中最后将key传递到CheckFlagActivity
,在CheckFlagActivity
中checkFlag
函数调用EncodeUtils
类实现base64编码,key为码表,encodeFlag为编码结果:
encodeFlag=3lkHi9iZNK87qw0p6U391t92qlC5rwn5iFqyMFDl1t92qUnL6FQjqln76l-P
跑更换码表base64解码算法还原flag:SangFor{212f4548-03d1-11ec-ab68-00155db3a27e}
PWN
BabyRop
有system
函数和/cin/sh
,简单ROP,缺少的/bin/sh\x00
可以用sh\x00
代替。
1 | #coding:utf-8 |
Crypto
RingRingRing
ring a ring a ring ring a ring a ring
nc测试md5-PoW之后,需要输入100组a,b,c,d,e,使得 $a^4+b^4+c^4+d^4=e^2$,且都不能为0。
构造 $1^4+1^4+1^4+1^4=2^2$,再按倍数做乘积 $k^4+k^4+k^4+k^4=(2k^2)^2,k \in [1,100]$,得到100组用例。
1 | from pwn import * |
Easy_Rsa
你了解RSA吗???
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 from Crypto.Util.number import *
from flag import flag
import gmpy2
def gen_prime(nbits, gamma):
g = getPrime(int(nbits * gamma))
alpha = 0.5 - gamma
while True:
a = getRandomNBitInteger(int(alpha * nbits))
p = 2 * g * a + 1
if isPrime(p):
b = getRandomNBitInteger(int(alpha * nbits))
q = 2 * g * b + 1
h = 2 * g * a * b + a + b
while not isPrime(q) or isPrime(h) or gmpy2.gcd(a, b) != 1:
b = getRandomNBitInteger(int(alpha * nbits))
q = 2 * g * b + 1
return p, q
def encrypt(nbits, gamma):
p, q = gen_prime(nbits, gamma)
n = p * q
e = getPrime(16)
while gmpy2.gcd(e, gmpy2.lcm(p-1,q-1)) != 1:
e = getPrime(16)
m = bytes_to_long(flag)
c = pow(m, e, n)
return n, e, c
n, e, c = encrypt(1024, 0.48)
print 'n =', n
print 'e =', e
print 'c =', c
# n = 84236796025318186855187782611491334781897277899439717384242559751095347166978304126358295609924321812851255222430530001043539925782811895605398187299748256080526691975084042025794113521587064616352833904856626744098904922117855866813505228134381046907659080078950018430266048447119221001098505107823645953039
# e = 58337
# c = 13646200911032594651110040891135783560995665642049282201695300382255436792102048169200570930229947213493204600006876822744757042959653203573780257603577712302687497959686258542388622714078571068849217323703865310256200818493894194213812410547780002879351619924848073893321472704218227047519748394961963394668
共素数攻击(common prime RSA)。
给出 $N=pq,p-1=2ga,q-1=2gb,h=2gab+a+b$,有 $N-1=2gh$,
所以 $x^{N-1} \pmod p$ 至多有 $a$ 个值,用 $x \rightarrow x^{N-1}+3$ 代替 Pollard’s rho算法中迭代函数,能在 $\text{O}(\sqrt{a})=\text{O}(N^{\frac{1}{4}-\frac{\gamma}{2}})$ 下分解 $N$。
common prime RSA在 $g$ 过小时, $g$ 也能轻易通过分解 $N-1$ 来解出。
1 | from Crypto.Util.number import * |
Bigrsa
BigRSA!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 from Crypto.Util.number import *
from flag import *
n1 = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061
n2 = 115383198584677147487556014336448310721853841168758012445634182814180314480501828927160071015197089456042472185850893847370481817325868824076245290735749717384769661698895000176441497242371873981353689607711146852891551491168528799814311992471449640014501858763495472267168224015665906627382490565507927272073
e = 65537
m = bytes_to_long(flag)
c = pow(m, e, n1)
c = pow(c, e, n2)
print("c = %d" % c)
# output
# c = 60406168302768860804211220055708551816238816061772464557956985699400782163597251861675967909246187833328847989530950308053492202064477410641014045601986036822451416365957817685047102703301347664879870026582087365822433436251615243854347490600004857861059245403674349457345319269266645006969222744554974358264
尝试发现 $\gcd(n_1,n_2)=p$,分别求出 $q_1=n_1/p,q_2=n_2/p$,再用常规解密方法两步求出 $m$:
1 | import gmpy2 |
Misc
签到题
简简单单猜数字01-30 SangFor{md5(---…..)}(32位md5)
12张图分别得到关键数字:28-08-30-07-04-20-02-17-23-01-12-19,md5得flag:SangFor{d93b7da38d89c19f481e710ef1b3558b}
Misc520
有一天,zip爱上了pcap,zip为了能与pcap创造更多机会,不断地将自己的能力表现出来。可是,LSBSteg却突然杀了出来,将pcap吞并于png中,不放出来。zip看到了png,多喝热水少做梦。zip异常的愤怒,不断地用自己的能力去报复png,不让png逃走。至今,zip仍未释怀。。。
拿到520.zip压缩包,循环嵌套着520层zip和story文件,脚本解压出所有文件(每次解压将story文件重命名防覆盖):
1 | import zipfile |
解出最里层是一张flag.png图片,按大小排序目录下所有文件,发现story150内容与其他不同:
1 | 这都被你发现了? |
得到数字 72, 89, 75, 88, 128, 93, 58, 116, 76, 121, 120, 63, 108,
根据提示,zsteg查看png图片存在lsb隐写,按bgr方式提取出一个zip加密压缩包,爆破得密码12345
解出flag.pcap。
wireshark查看发现全为USB流量,tshark提取:
tshark -r flag.pcap -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt
将鼠标数据还原鼠标移动轨迹:
1 | f=open('usbdata.txt','r') |
最后gnuplot做图:
gnuplot> plot "xy.txt"
得到后半部分数字:130, 63, 111, 94, 51, 134, 119, 146
结合flag格式,推知为变异凯撒移位解密,解出:
[71, 87, 72, 84, 123, 87, 51, 108, 67, 111, 109, 51, 95, 116, 48, 95, 77, 33, 115, 99, 125]
即GWHT{W3lCom3_t0_M!sc}
,按群提示换为Sangfor{W3lCom3_t0_M!sc}
。