作者是个好人,还有符号表这些东西的。菜鸡项目缠身没时间做难的,只有做些简单的了!来吧,尽情的吐槽我吧!
开门一个check_fun
但是只校验一个字节
进去看了下
看不懂在干啥
进去看了一眼发现有个常数
问了下度娘,她说这是MT随机数生成器
然后,简单用python简单实现了下
_DELTA = 0x9E3779B9 def _int32(x): # Get the 32 least significant bits. return int(0xFFFFFFFF & x) class MT19937: def __init__(self, seed): # Initialize the index to 0 self.index = 624 self.mt = [0] * 624 self.mt[0] = seed # Initialize the initial state to the seed for i in range(1, 624): self.mt[i] = _int32( 1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i) #print map(hex,self.mt) def extract_number(self): if self.index >= 624: self.twist() y = self.mt[self.index] # Right shift by 11 bits y = y ^ y >> 11 # Shift y left by 7 and take the bitwise and of 2636928640 y = y ^ y << 7 & 2636928640 # Shift y left by 15 and take the bitwise and of y and 4022730752 y = y ^ y << 15 & 4022730752 # Right shift by 18 bits y = y ^ y >> 18 self.index = self.index + 1 return _int32(y) def twist(self): for i in range(624): # Get the most significant bit and add it to the less significant # bits of the next number y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff)) self.mt[i] = self.mt[(i + 397) % 624] ^ y >> 1 if y % 2 != 0: self.mt[i] = self.mt[i] ^ 0x9908b0df self.index = 0 def encrypt(v,n,k): #if str == '': return str #v = _str2long(str, True) #k = _str2long(key.ljust(16, "\0"), False) #n = len(v) - 1 n=n-1 z = v[n] y = v[0] sum = 0 q = 6 + 52 // (n + 1) #print map(hex,v) #print n #print map(hex,k) while q > 0: sum = (sum + _DELTA) & 0xffffffff e = sum >> 2 & 3 for p in xrange(n): y = v[p + 1] v[p] = (v[p] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z))) & 0xffffffff z = v[p] y = v[0] v[n] = (v[n] + ((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[n & 3 ^ e] ^ z))) & 0xffffffff z = v[n] q -= 1 return v k=[0x67452301, 0x0EFCDAB89, 0x98BADCFE, 0x10325476] n=2 for i in range(0xFF): MT=MT19937(i) ret1=MT.extract_number() ret2=MT.extract_number() ret3=MT.extract_number() v=[ret1,ret3] v=encrypt(v,n,k) if ret2 - (v[0] + v[1]) == 0xA504A8F7: print "Found:",i,chr(i) break ''' MT=MT19937(0x31) ret1=MT.extract_number() ret2=MT.extract_number() ret3=MT.extract_number() v=[ret1,ret3] v=encrypt(v,n,k) print map(hex,v)VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV ''' #if ret2 - (ret1 + ret3) == 0xA504A8F7
其中的xxtea 密钥提出来就好了
输入的经过base64 解码然后des,MD5 一大堆运算
做这题我们不妨倒着来看
直接看比较的地方。这才符合逆向 ”逆“这个字吧!
查看引用,发现关键点在这个地方
进去圈圈的算法一看发现
有个全局变量,看引用发现有个地方对它初始化
在看了看比较逻辑发现类似于爸爸爸爸妈妈在哪里呀的算法。
s='**************@************-************--**----*****-***-**-*****-***#**-*****--*****-******-*****-******-------******-*-----******---**-*******-****--*****************' for i in range(len(s)): if (i)%13==0: print() print(s[i],end='') print() b=['01010101','01110101','11111111','11110000','00000010','10100101'] for i in range(len(b)): print(hex(int(b[i],2)),end=',') print() s='**************@************-************-***-**-*****--**----*****-***#**-*****--*****-******-*****-******-*-----******---**-*******-------******-****--*****************' for i in range(len(s)): if (i)%13==0: print() print(s[i],end='') print() b=['01010101','01110101','01111100','11111111','00000000','10101001'] for i in range(len(b)): print(hex(int(b[i],2)),end=',') print() s='**************@************-************-***-**-*****--*****-*****-***#**-*****--**----******-*****-******-****--******---**-*******-*-----******-------*****************' for i in range(len(s)): if (i)%13==0: print() print(s[i],end='') print() b=['01010101','01110101','01111101','11111100','00110000','10101000'] for i in range(len(b)): print(hex(int(b[i],2)),end=',') print() s='***************-------*****--*****-*****-***-**-*****--*****-*****-***#**-*****-***-**-*****-***-**-*****--**----******---**-******--*****-*****@************************' for i in range(len(s)): if (i)%13==0: print() print(s[i],end='') print() b=['00110000','10000000','00000011','00111111','11111101','01010101','01011010','10000000'] for i in range(len(b)): print(hex(int(b[i],2)),end=',') print() #11 11 11 11 #01010101 01 ''' ************* *@*********** *-*********** *--**----**** *-***-**-**** *-***#**-**** *--*****-**** **-*****-**** **-------**** **-*-----**** **---**-***** **-****--**** ************* 上(0) 左(2) 右(3) 下(1) 01010101,01110101,11111111,11110000,00000010,10100101 0x55,0x75,0xff,0xf0,0x2,0xa5 ************* *@*********** *-*********** *-***-**-**** *--**----**** *-***#**-**** *--*****-**** **-*****-**** **-*-----**** **---**-***** **-------**** **-****--**** ************* '01010101',01110101,01111100,11111111,00000000,10101001 0x55,0x75,0x7c,0xff,0x0,0xa9, ************* *@*********** *-*********** *-***-**-**** *--*****-**** *-***#**-**** *--**----**** **-*****-**** **-****--**** **---**-***** **-*-----**** **-------**** ************* 01010101,01110101,01111101,11111100,00110000,10101000 0x55,0x75,0x7d,0xfc,0x30,0xa8 ************* **-------**** *--*****-**** *-***-**-**** *--*****-**** *-***#**-**** *-***-**-**** *-***-**-**** *--**----**** **---**-***** *--*****-**** *@*********** ************* 00110000,10000000,00000011,00111111,11111101,01010101,01011010,10000000 0x30,0x80,0x3,0x3f,0xfd,0x55,0x5a,0x80 [0x55,0x75,0xff,0xf0,0x2,0xa5, 0x55,0x75,0x7c,0xff,0x0,0xa9, 0x55,0x75,0x7d,0xfc,0x30,0xa8, 0x30,0x80,0x3,0x3f,0xfd,0x55,0x5a,0x80] flag = [0x55,0x75,0xff,0xf0,0x2,0xa5, 0x55,0x75,0x7c,0xff,0x0,0xa9, 0x55,0x75,0x7d,0xfc,0x30,0xa8, 0x81,0xe5,0x8a,0x24,0xcb,0x6b,0x99,0xe6] '''
如图,菜鸡手动解了下这个,然后顺利的帮儿子找到了妈妈!
再顺推下几个步数怎么来的吧
1)输入36个字符base64解码后变成26个 刚好和上面的 6 + 6 + 6 +8 对应起来
2)将输入的base64 的 base64_encode[16:24] 作为密钥加密由base64 解码后的 base64_decode[18:26]
这里多说一句输入的为36个字符,解码后变成26个,
其中0-24个输入,解码后index对应的是解码后的 0-18 所以加密并没有加密到密钥,不会产生雪崩效应。
3)利用输入 base64_encode[8:16]作为密钥解密上一步加密的结果(MD5不用管,因为没有产生雪崩,这应该是防止多解的)
4)利用 输入base64_encode[0:8] 作为密钥加密上一步解密的结果
5)用 base64_decode[0:18]+后面 加密的8个字符作为迷宫步数进行找我未来的老婆
import base64 as B from Crypto.Cipher import DES input=B.b64encode(''.join(map(chr,[0x55,0x75,0xff,0xf0,0x2,0xa5, 0x55,0x75,0x7c,0xff,0x0,0xa9, 0x55,0x75,0x7d,0xfc,0x30,0xa8, 0x30,0x80,0x3,0x3f,0xfd,0x55,0x5a,0x80]))) key1=input[0:8] D=DES.new(key1,DES.MODE_ECB) dest='' f=B.b64decode(input)[18:] dest=D.encrypt(f) key2=input[8:16] D=DES.new(key2,DES.MODE_ECB) dest=D.decrypt(dest) key3=input[16:24] D=DES.new(key3,DES.MODE_ECB) dest=D.encrypt(dest) f=input[:24]+B.b64encode(dest) print 'flag is :'+f
[培训]《安卓高级研修班》彻底搞定函数抽取型壳!现在报名得源码和安卓8.1脱壳机!10月20日深圳专场不见不散!
最后于 20小时前 被大帅锅编辑 ,原因: