学习一下nullbook上的逆向题😊

reverse

babyconst (md5加密)

ida分析:

用findcrypt查看算法特征码,没有识别

跟进sub_40085B函数,发现有md5算法特征码

以及md5的加密算法

最后对比的也就是unk_603080数组了

shift+e提取数组,然后放在pycharm里面替换一下双引号,使十六进制数变成字符

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
encode = [ "39", "6D", "F0", "D2", "42", "41", "F8", "02", "16", "7A", \
"DC", "C0", "D6", "10", "6E", "D3", "FE", "68", "6F", "27", \
"E9", "00", "81", "6B", "B2", "B8", "BC", "63", "D7", "0D", \
"40", "08", "D2", "CD", "B7", "10", "60", "4D", "69", "64", \
"A8", "36", "25", "54", "F7", "DE", "F0", "96", "DF", "C4", \
"F8", "47", "AC", "DE", "92", "AC", "23", "C4", "69", "4B", \
"EF", "32", "50", "28", "46", "82", "A2", "4D", "59", "A9", \
"8E", "7A", "66", "D8", "E0", "D3", "1F", "D9", "BD", "68", \
"46", "04", "F6", "12", "D8", "A7", "1D", "EB", "0D", "FA", \
"03", "5E", "3F", "06", "A5", "9B", "99", "AA", "58", "66", \
"28", "D9", "70", "72", "73", "28", "6B", "4C", "87", "32", \
"DC", "FF", "A6", "C9", "FE", "07", "74", "20", "E1", "DE", \
"FD", "D7", "C8", "7B", "59", "CD", "1D", "73", "CB", "7F", \
"25", "22", "CC", "3D", "F2", "0F", "F2", "98", "7E", "98", \
"42", "7F", "05", "D2", "BE", "57", "03", "DD", "22", "DD", \
"C3", "18", "EA", "07", "24", "80", "44", "D7", "EC", "CC", \
"FF", "F5", "6B", "C4", "60", "70", "DA", "E9", "F9", "46", \
"6C", "11", "76", "5D", "0C", "21", "0E", "49", "91", "A0", \
"2A", "04", "E4", "21", "84", "9F", "2A", "B8", "9B", "7D", \
"9E", "EA"]
string = ""
arr = []
for i in range(len(encode)):
string += encode[i]
if (i+1)%16 == 0:
arr.append(string.lower())
string = ""
print(arr)

推荐pmd5网站,cmd5一块一条……

babyalgo (RC4加密)

跟进sub_400874加密函数,可以看出加密方法是RC4,”Nu1Lctf233”是密钥

在这两个函数中都出现了sub_400646函数,等价于swap()函数

写个idapython的脚本,提取出加密后的数组

1
2
3
4
5
6
start_addr = 0x400925
encode = []
for i in range(44):
encode.append(idc.get_wide_byte(start_addr+4*i+3))
print(encode)
# [198, 33, 202, 191, 81, 67, 55, 49, 117, 228, 142, 192, 84, 111, 143, 238, 248, 90, 162, 193, 235, 165, 52, 109, 113, 85, 8, 7, 178, 168, 47, 244, 81, 142, 12, 204, 51, 83, 49, 64, 214, 202, 236, 212]

刚开始发现出错了,到后面发现,ida里面的v8[39]没有给出……

只能猜测,v8[39]的数字,随便带入了个0x40,离答案很近了

后面猜测为0,放到cyberchef里面,对了……

下面是写的垃圾脚本……

1
2
3
4
5
6
7
arr = [198, 33, 202, 191, 81, 67, 55, 49, 117, 228, 142, 192, 84, 111, 143, 238, 248, 90, 162, 193, 235, 165, 52, 109, 113, 85, 8, 7, 178, 168, 47, 244, 81, 142, 12, 204, 51, 83, 49, 0, 64, 214, 202, 236, 212]
h = ""
for i in arr:
h+=(hex(i)[2:].rjust(2,"0"))
print(h)
# c621cabf5143373175e48ec0546f8feef85aa2c1eba5346d71550807b2a82ff4518e0ccc3353310040d6caecd4
# n1book{us1nG_f3atur3s_7o_de7erm1n3_4lg0ri7hm}

BabyLib

65537看起来有点像rsa

1
2
3
4
5
6
7
8
9
10
11
12
from Crypto.Util.number import *
import gmpy2
# 98422105447041051053864602088923253415180232127076474506079092477911332645192005791731779124677858425580609684921867
p = 9842210544704105105386460208892325341518023212707647450607909247791133264519200579173177912467785842558060968492186761162106356089009194470097546296829163
q = 12972360952153818155692381381571252126631475184728971905301445264084096070607651598626783223094292740492828654265391639843199875189333033337169565006624907
n = p * q
e = 65537
c = 110694010334901653238216140152683772418101197298114114481381418739511015861349388028360214495059500357527716613334520805339266807313669925649167175211788624655809951516502907329949137499677877779584898365309802983718066683849944838484002656376845311375573423677826690834875095904482448693671735053088583663382
d = gmpy2.invert(e,(p-1)*(q-1))
m = pow(c,d,n)
print(long_to_bytes(m))
# n1book{1d3nt1fy_GMp_l1br4ry}