@TOC

Give me num

打开题目后只有一个nc地址
尝试连接
给了一个图片出来 提示信息是lcg
百度一下
在这里插入图片描述利用多次nc得出来的数可以破解 a c m的值

在这里插入图片描述贴出官方的python脚本

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from pwn import *
import requests
import gmpy2
from bs4 import BeautifulSoup

# LCG solver
def lcg(m, a, c, x=0):
return (a * x + c) % m

def rlcg(m, a, c, x=0):
ainv = gmpy2.invert(a, m)
return ainv * (x - c) % m

def solve_a(lcg0, lcg1, lcg2, m):
a = (lcg2 - lcg1) * gmpy2.invert(lcg1 - lcg0, m) % m
return a

def solve_c(lcg0, lcg1, m, a):
c = (lcg1 - a * lcg0) % m
return c

session = requests.session()

def main():
# Get lcg values original
io=remote('129.226.4.186',7000)
e=io.recvuntil("please enter num:")
io.sendline("1")
lcg_0 = int(io.recvline("\n"))
e=io.recvuntil("please enter num:")
io.sendline("1")
lcg_1 = int(io.recvline("\n"))

e=io.recvuntil("please enter num:")
io.sendline("1")
lcg_2 = int(io.recvline("\n"))

e=io.recvuntil("please enter num:")
io.sendline("1")
lcg_3 = int(io.recvline("\n"))

# Find the mod value
modulus = -1
for mod_value in reversed(range(9999, 2**17)):
try:
a = solve_a(lcg_0, lcg_1, lcg_2, mod_value)
c = solve_c(lcg_0, lcg_1, mod_value, a)
next = lcg(mod_value, a, c, lcg_2)

if next == lcg_3:
modulus = mod_value
break
except ZeroDivisionError:
pass

# Now we have all the parameters
print('>> mod:')
print(mod_value)
print('>> a:')
print(a)
print('>> c:')
print(c)
for i in range(32):
m=str((a*lcg_3+c)%mod_value)
print(m)
lcg_3=int(m)
io.sendline(m)
s=io.recv(2048)
print(s)
if i==31:
print(s)
break



if __name__ == '__main__':
main()

EzCrack

简单的安卓题
直接打开用jeb2分析
在这里插入图片描述
很清楚的算法逻辑
输入的字符串先经过一个异或加密 然后再用aes加密
aes的key和iv都是已知的 利用网上的工具或者自己写一个脚本即可求得

官方解:
从代码中可以看到AES对应的解密函数“decrypt”并未使用,因此我们可以将对比的字符串进行AES解密,然后将得到的字符串使用异或算法就可以得到正确的flag。将AES算法和异或算法拷贝到eclipse中

TryIt.apk

还是一个安卓题
先用模拟器打开显示会“当前设备环境不安全,即将退出”
这是root的检测造成的 只需要把模拟器的root模式关闭即可
然后显示出
在这里插入图片描述
(这里是一个坑点 因为最后答案是4位 不知道是题出错了 还是我没有注意到别的地方)
不过既然明确说明了密码是六位数字 那么如果要爆破的话 肯定是可行的

在这里插入图片描述
调用了e加密 点进去看看
在这里插入图片描述
这里直接调用了native层 那我们继续分析

这里面说用到了反射调用 (我也是不很清楚)大概意思是再次调用原来dalvik层的函数
在这里插入图片描述
在这里指出了是aes算法 iv同时也已知

总的来说 大概意思是 你输入一个数 把这个数md5加密 加密后的内容作为aes算法的明文
和密钥 最后的输出的密文经过base64加密后与已知字符串进行比较

思路就是爆破明文 毕竟是6位数字(其实是4位数字)写一个爆破脚本求解

这里有个小知识点:
因为我开始是用python脚本写的
对明文的填充方式有点误解 以为明文满16位后不进行填充后来问了rx师傅后才知道
在这里插入图片描述
贴出官方的爆破脚本:

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package test;

import java.security.MessageDigest;
import java.util.Base64;
import java.util.Locale;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class Demo4 {
public static void main(String[] args) {

String pwd = "";
String crypt = "";
for (int i = 1000; i < 9999; i++) {
pwd = String.valueOf(i);
crypt = calc(pwd);
if (crypt.equals("lvNp7NkjNG7cNzGtGdxDyuDWcs8flAOpDs9sVHfnhqA=")) {
// 成功
System.out.println(String.valueOf(i));
System.out.println("flag{" + md5(pwd) + "}");
break;
}
}
}

public static String calc(String pwd) {
try {
String key = md5(pwd).substring(0, 16);
byte[] result = encryptAes(key.getBytes(), key.getBytes());
return Base64.getEncoder().encodeToString(result);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}

public static String md5(String string) {
byte[] hash;
try {
hash = MessageDigest.getInstance("MD5").digest(
string.getBytes("utf-8"));
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10) {
hex.append("0");
}
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString().toLowerCase(Locale.CHINA);
} catch (Exception e) {

}
return "";

}

public static byte[] encryptAes(byte[] sSrc, byte[] key) {
try {
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec iv = new IvParameterSpec(
"ae4e6a92284e488b".getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc);
return encrypted;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

Findit4Me