#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)
|
前面的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)
|
总结
这题本身不难,不过在位运算和tea方面都需要一些耐心去推
实际上很快就搞出来了,这几天懒散心严重,上完课就啥也不想干了,不行捏
前半个月倒是有参加比赛什么的 ,因为考试有一周多没有做事情,基本都在复习
逆向里现在学习了一些基本的动调方法还有一些常见的算法,应该可以做一般的题目了
但是编程思维和问题解决思维还是没有
需要再多加练习。
这个星期继续比赛
下周复习完高数,下下周考完试就可以去自习室安心写题了。