【WP】hgame-Week1复现学习
主要跟着wp复现一下其他方向,记录一下学到的东西
re
asm
16位的汇编
先把flag存到ds里,把加密结果存到es里
al寄存器八位,每次利用al寄存器逐字节变换flag
每一字节的高四位和低四位互换然后异或23
具体操作是先将该字节存入al寄存器,然后左移四位压栈,清空ax,再将该字节存入al,右移四位存到bx里,然后add ax,bx加回去,最后ax和23异或,从而此时al存着就是变换后的结果
然后以es为基址,[si-1]为偏移取密文和加密结果比较,若一致则接着比较下一位,每次si自加一循环28次,然后right;若中间某一次不一致则wrong
1 |
|
creakme
tea加密算法修改,多异或了一个sum,delta是0x12345678
要注意大小端的事
解密脚本如下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
uint32_t text[] =
{
0x48D93488, 0x30C144C,
0x52EB78C2, 0xED9CE5ED,
0xAE1FEDE6, 0xBA5A126D,
0xCF9284AA, 0x65E0F2E3
};
void decrypt (uint32_t* v, uint32_t* k) {
uint32_t v0 = v[0], v1 = v[1];
uint32_t delta = 0x12345678;
uint32_t sum = 0x12345678*32;
uint32_t k0 = k[0], k1 = k[1], k2 = k[2], k3 = k[3];
for (int i = 0; i < 32; i++) {
v1 -= ((v0 << 4) + k0) ^ (v0 + sum) ^ ((v0 >> 5) + k1) ^ sum;
v0 -= ((v1 << 4) + k2) ^ (v1 + sum) ^ ((v1 >> 5) + k3) ^ sum;
sum -= delta;
}
v[0]=v0;
v[1]=v1;
}
int main()
{
uint32_t k[4]= {0x44434241, 0x48474645, 0x4C4B4A49, 0x504F4E4D};
uint32_t v[2];
v[0] = text[0], v[1]=text[1];
decrypt(v, k);
printf("%x\n%x\n", v[0], v[1]);
v[0] = text[2], v[1]=text[3];
decrypt(v, k);
printf("%x\n%x\n", v[0], v[1]);
v[0] = text[4], v[1]=text[5];
decrypt(v, k);
printf("%x\n%x\n", v[0], v[1]);
v[0] = text[6], v[1]=text[7];
decrypt(v, k);
printf("%x\n%x\n", v[0], v[1]);
return 0;
}
得到数据1
2
3
4
5
6
7
86d616768
34487b65
5f797070
34633476
6e306974
7d21
0
0
16进制转字符串,由于大小端的原因顺序得到的字符是反的1
2
3
4
5
6magh
4H{e
_ypp
4c4v
n0it
}!
稍微调一下得到flaghgame{H4ppy_v4c4ti0n!}
flagchecker
1 | package com.example.flagchecker; |
可以看到大概是会将输入的字符串用rc4加密,密钥是carol,然后再用base64加密判断是否等于mg6CITV6GEaFDTYnObFmENOAVjKcQmGncF90WhqvCFyhhsyqq1s=
所以反解回去就能得到flaghgame{weLC0ME_To-tHE_WORLD_oF-AnDr0|D}
猫头鹰是不是猫
misc
群青,但是是幽灵东京
音频隐写,先用audacity看频谱图显示Yoasobi,属性里提示silenteye,用silenteye输入Yoasobi作密钥得到另一个附件地址,下下来文件名提示sstv,用rx-sstv解码,下一个虚拟声卡接收得到二维码,扫码得flag
这个压缩包有点麻烦
第一层zip暴力破解得到密码483279,解压得到一个加密的flag.zip,README.txt,password-note.txt
第二层密码在password-note中,用字典爆破得到密码&-`;qpCKliw2yTR\
第三层外面一个README.txt和一个被加密得zip,其中有一个flag.jpg和一个README.txt,README.txt提示仅存储(store),将其使用仅存储方式压缩后使用明文攻击,跑了很久没停于是手动停止,提示未找到口令但已知加密密钥,确定后可以直接另存一个已经解密的zip
解压得到flag.jpg,用binwalk分离得到一个zip,最后一层是伪加密,用winhex把头尾两个14000900改成14000000即可得到flag
好康的流量
wireshark打开,追踪tcp看到smtp交互过程,发送了一张图片,content内容base64转图片,用stegsolve打开再green plane2看到条形码,扫码得到前半段flag;analyse里data extract选RGB0,选column得到后半段flag
crypto
Dancing Line
向右1向下0,8位组成一个字节对应一个字符
Matryoshka
盲文->逆序摩斯->摩斯->ascii->维吉尼亚->base64->栅栏->凯撒
Easy RSA
RSA原理:
公钥和私钥的产生:
- 随机选择两个不同大质数p和q,计算 $N=p\times q$
- 根据欧拉函数,求得 $\varphi(N)=\varphi(p)\times \varphi(q) = (p-1)\times (q-1)$
- 选择一个小于$\varphi(N)$ 的整数$e$,使$e$和$\varphi(N)$互质,并求得$e$关于$\varphi(N)$的模反元素$d$,有$ed\equiv 1(mod \varphi(N))$
- 销毁$p$和$q$记录
此时$(N,e)$为公钥,$(N,d)$为私钥
m 原信息
c加密信息
n,e为公开密钥
d为解密密钥
加密$m^e\equiv c(mod N)$
解密$c^d\equiv m(mod N)$
题目给了e,p,q,c,要求m,只需要计算d,不难根据$ed\equiv 1(mod \phi(N))$求逆得到d,再利用$c^d\equiv m(mod N)$即可求得原文
English Novel
加密1
2
3
4
5
6
7
8
9
10
11def encrypt(data, key):
assert len(data) <= len(key)
result = ""
for i in range(len(data)):
if data[i].isupper():
result += chr((ord(data[i]) - ord('A') + key[i]) % 26 + ord('A'))
elif data[i].islower():
result += chr((ord(data[i]) - ord('a') + key[i]) % 26 + ord('a'))
else:
result += data[i]
return result
显然需要求出key
可以通过flag开头一定是hgame和给出的加密后的字符串得到key的前五位,从而将原文和对应的密文进行匹配,从而求出key,然后再解密flag.enc即可得到flag





