HGAME-Week2-Writeup

Week2

Web

1.LazyDogR4U

​ 首先打开题目地址

​ 根据题目给的hint,在地址栏后面加上 /www.zip 获得网页源码

​ 接着打开 lazy.php 和 flag.php 这两个php文件,再根据变量覆盖的提示找到漏洞点

​ 这里划线处的两个$符号容易导致变量覆盖,那么根据 flag.php 中得到flag的条件就可以进行构造,相当于: $_SESSSION[username]=admin

​ 双写SESSION是因为上面str_replace的过滤

​ 得到flag

2.Post to zuckonit

​ 点开后发现是留言板,题目也很明确的指出是xss,那么就先尝试输入 script,iframe,image

​ 输入后发现不管大小写 script 都会被过滤掉,小写的 iframe 会被过滤,image则不会被过滤

​ 之后尝试输入 img src=1 onerror = alert(1) ,让错误的图片导致弹窗

​ 输出了这么个东西,把这个输入再 post 就会弹窗,成功弹窗之后就是找一个 xss 平台来接受 cookie 信息

​ 根据之前的规律 post 平台给的语句,并用脚本得出 md5 验证码提交,接收到 cookie 信息

脚本:

1
2
3
4
5
6
7
8
9
10
import hashlib
def md5(s):
return hashlib.md5(s.encode()).hexdigest()
def get_code():
code = 'XXXXXX'
for i in range(10000000, 99999999): #8位md5
if md5(str(i)).startswith(code):
return str(i)

print(get_code())

​ 接着就伪造 admin cookie 得到flag

Re

1.ezApk

安卓逆向,用 jadx 反编译为 java,找到 onClick 事件

​ 这条判断语句是关键,在资源文件中找到加密后的 flag 和 key

​ s函数用来加密输入的字符串,转到s函数分析

​ 仔细分析后得知是AES CBC模式加密,密钥是之前的key经过sha-256加密得到的,iv向量则是key经过MD5加密得到的,最后将加密结果再进行一次 base64 加密得到之前的 flag

​ 尝试用在线网站解密,但是网站一般只支持 16 位 iv 值解密,没有别的办法只能东拼西凑写出 java 脚本来解密

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.company;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class Main {

//md5,sha-256加密
public static byte[] t(String str, String str2) {
MessageDigest instance = null;
try {
instance = MessageDigest.getInstance(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] bytes = str2.getBytes();
byte[] digest = instance.digest(bytes);
return digest;
}


//解密
public static String desEncrypt(String data, byte[] key) {

byte[] ivString = t("MD5","A_HIDDEN_KEY"); //iv向量
byte[] iv = ivString;

try {
byte[] encryp = Base64.getDecoder().decode(data);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] original = cipher.doFinal(encryp);
return new String(original);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public static void main(String[] args) {
String data = "EEB23sI1Wd9Gvhvk1sgWyQZhjilnYwCi5au1guzOaIg5dMAj9qPA7lnIyVoPSdRY"; //密文
byte[] key =t("SHA-256","A_HIDDEN_KEY"); //密钥
String desencrypt = desEncrypt(data, key);
System.out.println("解密后:"+desencrypt);
}
}

​ 因为要用到的是AES 256位解密,而 java 本身只支持 128位 AES 解密,所以就要做其他的一些配置才能解密

2.helloRe2

​ 拖进 IDA 分析,乍一看结构有点复杂,password1 的判断在后半部分,而password2 的判断在前半部分,先分析 password1

​ 关键部分是这条判断,判断输入的password长度和 password 经过一系列操作后的结果,用 ollydbg 调试并不断猜测,得知这么一系列操作就是判断输入的字符串是否是给出的密文的逆序

​ 之后再分析 pwd2

​ 应该又是AES CBC 模式加密,找到 iv 和 密钥,密钥是pwd1经过异或得到,密文是已经给出密文的逆序

![](D:\HGAME2021\HGAME week2\re2(4).png)

​ 解密就用上一题的脚本

​ 这里看着像是两次加密,但其实只有一次

3.fake_debugger beta

​ nc题目地址,发现只有在 ebx 经过一次转换后与 eax 相等才能继续调试,之后不断调试发现

​ 转换前的 ebx 与 eax 异或后就是 flag 中的字符,那就一个个调试下来得到 flag

Crypto

1.gcd or more?

​ 看着像是RSA,但是e = 2。百度后查到低指数爆破,之后又看到Rabin算法,特征是e = 2 ,那么就用这个脚本解题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import gmpy2
import libnum

e = 2
p = 85228565021128901853314934583129083441989045225022541298550570449389839609019
q = 111614714641364911312915294479850549131835378046002423977989457843071188836271
n = p * q
c = 7665003682830666456193894491015989641647854826647177873141984107202099081475984827806007287830472899616818080907276606744467453445908923054975393623509539

#c= int(open('./flag.enc','rb').read().encode('hex'),16)
mp = pow(c, (p + 1) // 4, p)
mq = pow(c, (q + 1) // 4, q)
yp = gmpy2.invert(p, q)
yq = gmpy2.invert(q, p)
r = (yp * p * mq + yq * q * mp) % n
rr = n - r
s = (yp * p * mq - yq * q * mp) % n
ss = n - s
print(libnum.n2s(int(r)))
print(libnum.n2s(int(rr)))
print(libnum.n2s(int(s)))
print(libnum.n2s(int(ss)))

2.WhitegiveRSA

​ 已知N,那就拿到在线网站里分解出大素数 q 和 p,剩下来都已知就用脚本解密

Misc

1.Tools

​ 下载解压得到一个压缩包和一张图片,根据题目的 tools 和压缩包名 f5 尝试用 f5 工具破解压缩包密码,破解所需的密码在图片的详细信息中

​ 打开加密压缩包后发现一部分二维码和压缩包,接着就是像之前那样找到压缩包名里的工具解密,最终集齐4张二维码碎片,用win10自带的画图工具拼合,扫码得flag

2.Telegraph:1601 6639 3459 3134 0892

​ 题目为音频隐写,又提到听着反胃,于是猜测是摩斯电码。听了之后,中间有一段嘀嗒声,这一段就是需要摩斯解密的部分,接着把音频拖到 Audacity 里面分析

​ 首先看一下频谱图

​ 得到850hz的提示,之后尝试翻译摩斯电码,发现中间有一段无法辨认就想到要滤波,用的是上面的提示

​ 窄的是**.** 宽的是**-** ,翻译后解密就得到flag

3.Hallucigenia

​ 只给了一张图,那么就先用 Stegsolve 左右调一下得到二维码

​ 扫码得到一串 base64 解码发现最后是 GNP ,根据题目中 **“我们不仅弄错了他的上下,还颠倒了它的左右。” **逆序处理后粘贴到winhex保存为图片

​ 发现又是上下左右颠倒,倒回来就得flag

4.DNS

​ 流量包分析,筛选 dns 得到一串域名并访问

​ 抓包得

​ 查一下 SPF 知道是一种 dns 记录,那就用在线网站查一下dns记录,得到flag

总结:

​ 这周比较摸鱼,web 能做出两道是因为给了具体的考点,参照往年 writeup 一点点做下来。 re 做了很久,因为之前没有接触过 apk 逆向,对 aes 加密也不太了解,最后能全部做出来真是太好了,逆向的时候果然是要抓重点,解完题后才发现其实挺简单的。 密码学是真不太行,这周 pwn 也基本没看,Misc 倒是做的挺顺畅的,下周要试着把之前的知识捡起来了

作者

0wl

发布于

2021-03-27

更新于

2021-11-16

许可协议

评论