知识点积累:
LOWORD()得到一个32bit数的低16bit
HIWORD()得到一个32bit数的高16bit
LOBYTE()得到一个16bit数最低(最右边)那个字节
HIBYTE()得到一个16bit数最高(最左边)那个字节
查壳——
64位,无壳
IDA伺候
进去按个TAB就发现到了破解函数
先把明显的函数换个名字
从头开始慢慢看,反正不长,长的话就后面慢慢看
首先他要我们输入一个33长度的密码
然后进入for循环看
这里有个lobyte,查一下:
LOBYTE是一个在汇编语言中用于获取双字类型数据的低字节的指令。具体来说,LOBYTE指令返回双字类型数据的低8位。
ok,我们再换个名字
个人偏好,这样看着舒服
因为最后是cmpflag=aflag
我们去看cmpflag
提取好数据,等下肯定要用来写脚本的
顺带的还可以提取下bflag的数据
针对这个lobyte,最开始我还很疑惑,这个bflag刚好33个,咋搞双字节
后面问了下才知道,给一个字节,前八位等于后八位,所以lobyte就是他自身
so,我们逆向这写代码
database=[9,
10,
15,
23,
7,
24,
12,
6,
1,
16,
3,
17,
32,
29,
11,
30,
27,
22,
4,
13,
19,
20,
21,
2,
25,
5,
31,
8,
18,
26,
28,
14,
0]
cmpflag=[103, 121, 123, 127, 117, 43, 60, 82, 83, 121,
87, 94, 93, 66, 123, 45, 42, 102, 66, 126,
76, 87, 121, 65, 107, 126, 101, 60, 92, 69,
111, 98, 77,]
flag=''
print(len(cmpflag))
for i in range(33):
flag+=chr(cmpflag[i]^database[i])
print(flag)
flag='nsthr30TRiTO}_p31pFs_ClCr{z4N_slE'
s='nsthr30TRiTO}_p31pFs_ClCr{z4N_slE'
database=[9,
10,
15,
23,
7,
24,
12,
6,
1,
16,
3,
17,
32,
29,
11,
30,
27,
22,
4,
13,
19,
20,
21,
2,
25,
5,
31,
8,
18,
26,
28,
14,
0]
flag=list(range(33))
for i in range(0,33):
flag[database[i]]=ord(s[i])
s2=''
for i in range(33):
s2+=chr(flag[i])
print(s2)
最后得到ERCTF{Tr4nsp0sltiON_Clph3r_1s_3z}
下班下班!