第五题:魅影舞姬
2019-09-25 11:41:16 Author: bbs.pediy.com(查看原文) 阅读量:144 收藏

[原创] 第五题:魅影舞姬

20小时前 31

     作者是个好人,还有符号表这些东西的。菜鸡项目缠身没时间做难的,只有做些简单的了!来吧,尽情的吐槽我吧!

开门一个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小时前 被大帅锅编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-254655.htm
如有侵权请联系:admin#unsafe.sh