主要跟着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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
unsigned char t[] =
{
0x91, 0x61, 0x01, 0xC1, 0x41, 0xA0, 0x60, 0x41, 0xD1, 0x21,
0x14, 0xC1, 0x41, 0xE2, 0x50, 0xE1, 0xE2, 0x54, 0x20, 0xC1,
0xE2, 0x60, 0x14, 0x30, 0xD1, 0x51, 0xC0, 0x17
};
int main(){
for (int i = 0; i < 28; i++){
t[i] = t[i]^28;
t[i] = (t[i]>>4) | t[i]<<4;
printf("%c", t[i]);
}

return 0;
}

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
#include <stdio.h>
#include <stdint.h>
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
8
6d616768
34487b65
5f797070
34633476
6e306974
7d21
0
0

16进制转字符串,由于大小端的原因顺序得到的字符是反的
1
2
3
4
5
6
magh
4H{e
_ypp
4c4v
n0it
}!

稍微调一下得到flaghgame{H4ppy_v4c4ti0n!}

flagchecker

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
package com.example.flagchecker;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class MainActivity extends AppCompatActivity {
/* access modifiers changed from: protected */
@Override // android.support.v7.app.AppCompatActivity, android.support.v4.app.SupportActivity, android.support.v4.app.FragmentActivity
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
((Button) findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {
/* class com.example.flagchecker.MainActivity.AnonymousClass1 */

public void onClick(View view) {
byte[] bArr = new byte[0];
try {
bArr = MainActivity.encrypt(((EditText) MainActivity.this.findViewById(R.id.editTextTextPersonName)).getText().toString(), "carol");
} catch (Exception e) {
e.printStackTrace();
}
if (Base64.encodeToString(bArr, 0).replace("\n", "").equals("mg6CITV6GEaFDTYnObFmENOAVjKcQmGncF90WhqvCFyhhsyqq1s=")) {
Toast.makeText(MainActivity.this, "Congratulations!!!", 1).show();
} else {
Toast.makeText(MainActivity.this, "Fail,try again.", 1).show();
}
}
});
}

public static byte[] encrypt(String str, String str2) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(str2.getBytes(), 0, str2.length(), "RC4");
Cipher instance = Cipher.getInstance("RC4");
instance.init(1, secretKeySpec);
return instance.doFinal(str.getBytes());
}
}

可以看到大概是会将输入的字符串用rc4加密,密钥是carol,然后再用base64加密判断是否等于mg6CITV6GEaFDTYnObFmENOAVjKcQmGncF90WhqvCFyhhsyqq1s=

所以反解回去就能得到flaghgame{weLC0ME_To-tHE_WORLD_oF-AnDr0|D}

猫头鹰是不是猫

misc

群青,但是是幽灵东京

音频隐写,先用audacity看频谱图显示Yoasobi,属性里提示silenteye,用silenteye输入Yoasobi作密钥得到另一个附件地址,下下来文件名提示sstv,用rx-sstv解码,下一个虚拟声卡接收得到二维码,扫码得flag

H9gPYQ.png

这个压缩包有点麻烦

第一层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原理:

公钥和私钥的产生:

  1. 随机选择两个不同大质数p和q,计算 $N=p\times q$
  2. 根据欧拉函数,求得 $\varphi(N)=\varphi(p)\times \varphi(q) = (p-1)\times (q-1)$
  3. 选择一个小于$\varphi(N)$ 的整数$e$,使$e$和$\varphi(N)$互质,并求得$e$关于$\varphi(N)$的模反元素$d$,有$ed\equiv 1(mod \varphi(N))$
  4. 销毁$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
11
def 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