东北大学招新_re

elf文件,ida64打开,看到程序很简单的加密,但是涉及到数据类型之间的转化和经典的逆向过程

image-20210829132912959

确定了输入的flag是22位,然后经过三轮运算,将得到的和给出的数组进行比较,逻辑简单,开始逆向!

思路:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#首先将三轮运算逆向回去
targ=[ 0x03, 0x1D, 0x24, 0x1C, 0x06, 0x1A, 0x3C, 0x3F, 0x04, 0x32,
0x3E, 0x11, 0x1C, 0x0B, 0x0D, 0x1F, 0xFD, 0x09, 0xF3, 0xFB,
0x98, 0x92, 0x00]
#每一位和后一位异或,所以最后一位是不会变的,这就是突破口
for i in range(22):
targ[21-i]=targ[21-i]^targ[22-i]
print(targ)

for i in range(22):
targ[21-i]=targ[21-i]-targ[22-i]
print(targ)

for i in range(22):
targ[i]-=i
print(targ)

这时得到的数组是

1
2
3
targ=[-154, 365, -157, 362, -129, 374, -131, 364, -151, 385,
-147, 367, -141, 384, -145, 373, -140, 386, -375, 377,
-136, 146, 0]

这里很明显看到因为python的数据类型基本没有限制,所以会出现 很多大数和负数

在C语言里面,一个byte的无符号整数是0-255,这里看到程序里面都是单字节,所以会出现循环现象,这里将他门进行复原

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for i in range(22):
if targ[i]>255:
targ[i]%=256
#因为这里超过256会循环,所以要%256
if targ[i]<0:
targ[i]&=0xffffffff
#考虑到负数的缘故,要先将负数转化成正数(有符号数转化无符号数)
print(targ)

#最后统一规矩一下数据,然后字符输出就可以了
for i in range(23):
if targ[i]>255:
targ[i]%=256
print(chr(targ[i]),end='')
print()
print(targ)

最后得到flag:

flag{qweaxcdgsafdqwfd}