#Re2

https://blog.csdn.net/alidada_blog/article/details/81290323

修复之后,发现这里有个永真

进入二进制界面批量删改

重编译之后,稍微修修

得到正常界面

在进入程序启动之前,会在初始化中跳转指制定的初始化进程

也就是一个反调试的窗口,这里可以通过反调试的窗口内容交叉检索出来

对其跳转条件进行修改就可以绕过。同时在进入主函数之后,也就是图中的位置也有个反调试,可以通过nop掉跳转或者是值的更改来绕过

flag1的加密方式,略微抽象的位运算,这几天一直没啥状态,没写出来

本质上是一个dword数组不断交换然后加密,首位是不变的。

写个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
key=[0x6C637953, 0x76656C6F, 0xD754C061, 0x023BA78B, 0xEBFD7C45, 0x60CBC8EF, 0x9CA6A4BC, 0x6BE85ECF, 0xE84E5C76, 0x07812C36]
flag1=[0]*8
flag1[0]=key[0]
flag=''
for i in range(1,8): #换位不影响异或和或操作,可以直接进行异或和或的逆操作
temp = key[i+1]
for j in range(i):
temp^=key[j]
flag1[i]=(temp<<17)&0xffffffff|(temp>>15)
for i in range(len(flag1)):
flag+=(chr(flag1[i] & 0xff))
flag+=(chr(flag1[i] >> 8 & 0xff))
flag+=(chr(flag1[i] >> 16 & 0xff))
flag+=(chr(flag1[i]>>24))
print(flag)
#Syclover{0ne_M0RE_step_To_f1nal}

前面的flag1应该是得出最终的key

关键加密位置在flag2位置处,而这里的v37就是之前加密过的flag1

进入加密函数,看见了比较类似tea的特征

进入函数


后面就是简单的tea环节

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for i in range(4):
a=data_real[i*2]
b=data_real[i*2+1]
for x in range(31,-1,-1):
sum=(x+1)*delta&0xffffffff
b=b^x&0xffffffff
a=a^x&0xffffffff
b=(b-((key[2]+4*a)^((sum+a)^(key[3]+(a>>5)))&0xffffffff)&0xffffffff)&0xffffffff
a=(a-(((key[0]+4*b)^(sum+b))&0xffffffff^(key[1]+(b>>5))))&0xffffffff
data_real[i*2]=a
data_real[i*2+1]=b
final_flag=''
for i in range(len( data_real)):
final_flag+=(chr( data_real[i] & 0xff))
final_flag+=(chr( data_real[i] >> 8 & 0xff))
final_flag+=(chr( data_real[i] >> 16 & 0xff))
final_flag+=(chr( data_real[i]>>24))
print(final_flag)

#Syclover{st3psCanBeAccumu1ated~}

总结

这题本身不难,不过在位运算和tea方面都需要一些耐心去推

实际上很快就搞出来了,这几天懒散心严重,上完课就啥也不想干了,不行捏

前半个月倒是有参加比赛什么的 ,因为考试有一周多没有做事情,基本都在复习

逆向里现在学习了一些基本的动调方法还有一些常见的算法,应该可以做一般的题目了

但是编程思维和问题解决思维还是没有

需要再多加练习。

这个星期继续比赛

下周复习完高数,下下周考完试就可以去自习室安心写题了。