首页
社区
课程
招聘
[原创]第六题 Repwn
2019-3-23 12:48 2898

[原创]第六题 Repwn

2019-3-23 12:48
2898

1.思路



仿佛没看到正确的地方,结合题目Repwn
很明显是利用漏洞

2.正文


貌似判断的后八位是这几个字母

更新后

直接用z3解
from z3 import *

s=Solver()
X=[''for i in range(8)]

r=Int('r')
for i in range(8):
	t='X'+str(i)
	X[i]=Int(t)
print X
for i in range(8):
	s.add(And(X[i]>=0,X[i]<=9))

v1 = X[3] + 1000 * X[0] + 100 * X[1] + 10 * X[2]
v2 = X[5] + 10 * X[4]
v3 = X[7] + 10 * X[6]
r1 = 2 * (v1 + v2)
s.add(r1==4040)
r2= 3 * v2 / 2
s.add(r2 + 100 * v3 == 115)
s.add(v1 - 110 * v3 == 1900)
num=''
if s.check()==sat:
	m=s.model()
	#print m
	for i in range(8):
		num+=chr(int(str(m[X[i]]))+0x30)
	print num
else:
	print "No Solution!"

前八个
接着下面

这里应该就是溢出点呢!
那么要跳到哪里呢!

直接用这个找

可以计算到后面4个字符
‘HaCk’
所以跳转的就为

后面的好像还有判断但是听说就到这就可以提交了。
看了下后面的地方,菜鸡不知道用的什么算法!
好像都是一些进制转换之类的。
硬着头皮硬推了一下算法,但是其中有几个表好像不是单射的
也就是说只能正向求啊!!!!!!!
照理说应该是有多解的
// CrackMe-RePwn.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
unsigned char table[] =
{
	0x0E, 0x04, 0x0D, 0x01, 0x02, 0x0F, 0x0B, 0x08, 0x03, 0x0A,
	0x06, 0x0C, 0x05, 0x09, 0x00, 0x07, 0x00, 0x0F, 0x07, 0x04,
	0x0E, 0x02, 0x0D, 0x01, 0x0A, 0x06, 0x0C, 0x0B, 0x09, 0x05,
	0x03, 0x08, 0x04, 0x01, 0x0E, 0x08, 0x0D, 0x06, 0x02, 0x0B,
	0x0F, 0x0C, 0x09, 0x07, 0x03, 0x0A, 0x05, 0x00, 0x0F, 0x0C,
	0x08, 0x02, 0x04, 0x09, 0x01, 0x07, 0x05, 0x0B, 0x03, 0x0E,
	0x0A, 0x00, 0x06, 0x0D, 0x0F, 0x01, 0x08, 0x0E, 0x06, 0x0B,
	0x03, 0x04, 0x09, 0x07, 0x02, 0x0D, 0x0C, 0x00, 0x05, 0x0A,
	0x03, 0x0D, 0x04, 0x07, 0x0F, 0x02, 0x08, 0x0E, 0x0C, 0x00,
	0x01, 0x0A, 0x06, 0x09, 0x0B, 0x05, 0x00, 0x0E, 0x07, 0x0B,
	0x0A, 0x04, 0x0D, 0x01, 0x05, 0x08, 0x0C, 0x06, 0x09, 0x03,
	0x02, 0x0F, 0x0D, 0x08, 0x0A, 0x01, 0x03, 0x0F, 0x04, 0x02,
	0x0B, 0x06, 0x07, 0x0C, 0x00, 0x05, 0x0E, 0x09, 0x0A, 0x00,
	0x09, 0x0E, 0x06, 0x03, 0x0F, 0x05, 0x01, 0x0D, 0x0C, 0x07,
	0x0B, 0x04, 0x02, 0x08, 0x0D, 0x07, 0x00, 0x09, 0x03, 0x04,
	0x06, 0x0A, 0x02, 0x08, 0x05, 0x0E, 0x0C, 0x0B, 0x0F, 0x01,
	0x0D, 0x06, 0x04, 0x09, 0x08, 0x0F, 0x03, 0x00, 0x0B, 0x01,
	0x02, 0x0C, 0x05, 0x0A, 0x0E, 0x07, 0x01, 0x0A, 0x0D, 0x00,
	0x06, 0x09, 0x08, 0x07, 0x04, 0x0F, 0x0E, 0x03, 0x0B, 0x05,
	0x02, 0x0C, 0x07, 0x0D, 0x0E, 0x03, 0x00, 0x06, 0x09, 0x0A,
	0x01, 0x02, 0x08, 0x05, 0x0B, 0x0C, 0x04, 0x0F, 0x0D, 0x08,
	0x0B, 0x05, 0x06, 0x0F, 0x00, 0x03, 0x04, 0x07, 0x02, 0x0C,
	0x01, 0x0A, 0x0E, 0x09, 0x0A, 0x06, 0x09, 0x00, 0x0C, 0x0B,
	0x07, 0x0D, 0x0F, 0x01, 0x03, 0x0E, 0x05, 0x02, 0x08, 0x04,
	0x03, 0x0F, 0x00, 0x06, 0x0A, 0x01, 0x0D, 0x08, 0x09, 0x04,
	0x05, 0x0B, 0x0C, 0x07, 0x02, 0x0E, 0x02, 0x0C, 0x04, 0x01,
	0x07, 0x0A, 0x0B, 0x06, 0x08, 0x05, 0x03, 0x0F, 0x0D, 0x00,
	0x0E, 0x09, 0x0E, 0x0B, 0x02, 0x0C, 0x04, 0x07, 0x0D, 0x01,
	0x05, 0x00, 0x0F, 0x0A, 0x03, 0x09, 0x08, 0x06, 0x04, 0x02,
	0x01, 0x0B, 0x0A, 0x0D, 0x07, 0x08, 0x0F, 0x09, 0x0C, 0x05,
	0x06, 0x03, 0x00, 0x0E, 0x0B, 0x08, 0x0C, 0x07, 0x01, 0x0E,
	0x02, 0x0D, 0x06, 0x0F, 0x00, 0x09, 0x0A, 0x04, 0x05, 0x03,
	0x0C, 0x01, 0x0A, 0x0F, 0x09, 0x02, 0x06, 0x08, 0x00, 0x0D,
	0x03, 0x04, 0x0E, 0x07, 0x05, 0x0B, 0x0A, 0x0F, 0x04, 0x02,
	0x07, 0x0C, 0x09, 0x05, 0x06, 0x01, 0x0D, 0x0E, 0x00, 0x0B,
	0x03, 0x08, 0x09, 0x0E, 0x0F, 0x05, 0x02, 0x08, 0x0C, 0x03,
	0x07, 0x00, 0x04, 0x0A, 0x01, 0x0D, 0x0B, 0x06, 0x04, 0x03,
	0x02, 0x0C, 0x09, 0x05, 0x0F, 0x0A, 0x0B, 0x0E, 0x01, 0x07,
	0x06, 0x00, 0x08, 0x0D, 0x04, 0x0B, 0x02, 0x0E, 0x0F, 0x00,
	0x08, 0x0D, 0x03, 0x0C, 0x09, 0x07, 0x05, 0x0A, 0x06, 0x01,
	0x0D, 0x00, 0x0B, 0x07, 0x04, 0x09, 0x01, 0x0A, 0x0E, 0x03,
	0x05, 0x0C, 0x02, 0x0F, 0x08, 0x06, 0x01, 0x04, 0x0B, 0x0D,
	0x0C, 0x03, 0x07, 0x0E, 0x0A, 0x0F, 0x06, 0x08, 0x00, 0x05,
	0x09, 0x02, 0x06, 0x0B, 0x0D, 0x08, 0x01, 0x04, 0x0A, 0x07,
	0x09, 0x05, 0x00, 0x0F, 0x0E, 0x02, 0x03, 0x0C, 0x0D, 0x02,
	0x08, 0x04, 0x06, 0x0F, 0x0B, 0x01, 0x0A, 0x09, 0x03, 0x0E,
	0x05, 0x00, 0x0C, 0x07, 0x01, 0x0F, 0x0D, 0x08, 0x0A, 0x03,
	0x07, 0x04, 0x0C, 0x05, 0x06, 0x0B, 0x00, 0x0E, 0x09, 0x02,
	0x07, 0x0B, 0x04, 0x01, 0x09, 0x0C, 0x0E, 0x02, 0x00, 0x06,
	0x0A, 0x0D, 0x0F, 0x03, 0x05, 0x08, 0x02, 0x01, 0x0E, 0x07,
	0x04, 0x0A, 0x08, 0x0D, 0x0F, 0x0C, 0x09, 0x00, 0x03, 0x05,
	0x06, 0x0B
};
unsigned char d_table[16][48] =
{
	0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
	0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00,
	0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
	0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00,
	0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01,
	0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
	0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
	0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01,
	0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00,
	0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01,
	0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
	0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01,
	0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,
	0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
	0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
	0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00,
	0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00,
	0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01,
	0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00,
	0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00,
	0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01,
	0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
	0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
	0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
	0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
	0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
	0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00,
	0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01,
	0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01,
	0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
	0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
	0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01,
	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
	0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
	0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
	0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01,
	0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
	0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01,
	0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01,
	0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01,
	0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00,
	0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00,
	0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01,
	0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01,
	0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
	0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01,
	0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
	0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00,
	0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01,
	0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
	0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
	0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01,
	0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00,
	0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00,
	0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01,
	0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
	0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01,
	0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
	0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00,
	0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00,
	0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
	0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01,
	0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
	0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
	0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
	0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01,
	0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
};
unsigned char t3[0x30] =
{
	0x20, 0x01, 0x02, 0x03, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07,
	0x08, 0x09, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0D,
	0x0E, 0x0F, 0x10, 0x11, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
	0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x18, 0x19, 0x1A, 0x1B,
	0x1C, 0x1D, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x01
};
unsigned char t4[] =
{
	0x10, 0x07, 0x14, 0x15, 0x1D, 0x0C, 0x1C, 0x11, 0x01, 0x0F,
	0x17, 0x1A, 0x05, 0x12, 0x1F, 0x0A, 0x02, 0x08, 0x18, 0x0E,
	0x20, 0x1B, 0x03, 0x09, 0x13, 0x0D, 0x1E, 0x06, 0x16, 0x0B,
	0x04, 0x19
};
unsigned char calc_f[] =
{
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01,
	0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00,
	0x00, 0x01, 0x01, 0x00
};
unsigned char F[64] =
{
	0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 
	0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 
	0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01
};
unsigned char dump[] = {
	0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00
	,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x01
	,0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x00
	,0x00,0x01,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x01,0x01
};
unsigned char R[] = {
	0x01,0x00,0x00,0x01,0x01,0x01,0x00,0x01,0x01,0x00,0x01,0x01,0x00,0x00,0x00,0x00
	,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x00,0x00
	,0x01,0x00,0x00,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00
	,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00
};
unsigned char a0[0x40] =
{
	0x28, 0x08, 0x30, 0x10, 0x38, 0x18, 0x40, 0x20, 0x27, 0x07,
	0x2F, 0x0F, 0x37, 0x17, 0x3F, 0x1F, 0x26, 0x06, 0x2E, 0x0E,
	0x36, 0x16, 0x3E, 0x1E, 0x25, 0x05, 0x2D, 0x0D, 0x35, 0x15,
	0x3D, 0x1D, 0x24, 0x04, 0x2C, 0x0C, 0x34, 0x14, 0x3C, 0x1C,
	0x23, 0x03, 0x2B, 0x0B, 0x33, 0x13, 0x3B, 0x1B, 0x22, 0x02,
	0x2A, 0x0A, 0x32, 0x12, 0x3A, 0x1A, 0x21, 0x01, 0x29, 0x09,
	0x31, 0x11, 0x39, 0x19
};
unsigned char a3[] =
{
	0x3A, 0x32, 0x2A, 0x22, 0x1A, 0x12, 0x0A, 0x02, 0x3C, 0x34,
	0x2C, 0x24, 0x1C, 0x14, 0x0C, 0x04, 0x3E, 0x36, 0x2E, 0x26,
	0x1E, 0x16, 0x0E, 0x06, 0x40, 0x38, 0x30, 0x28, 0x20, 0x18,
	0x10, 0x08, 0x39, 0x31, 0x29, 0x21, 0x19, 0x11, 0x09, 0x01,
	0x3B, 0x33, 0x2B, 0x23, 0x1B, 0x13, 0x0B, 0x03, 0x3D, 0x35,
	0x2D, 0x25, 0x1D, 0x15, 0x0D, 0x05, 0x3F, 0x37, 0x2F, 0x27,
	0x1F, 0x17, 0x0F, 0x07
};
char Src[64] = { 0 };
char Src1[64] = { 0 };
char after_calc[0x30] = { 0 };

void changce(char *Dst, char *a2, unsigned char *a3, signed int Size)
{
	char *v4; // esi
	signed int i; // edx

	v4 = a2;
	char *t = (char *)malloc(sizeof(char)*Size);
	memset(t, 0, Size);
	for (i = 0; i < Size; ++i)
		t[i] = v4[a3[i] - 1];
	memcpy(Dst, t, Size);
	free(t);
}
void xorf(char *c, char *a2, int size)
{
	char *a2_1; // esi
	int v4; // edx
	char *a1; // ebx

	for (int i = 0; i < size; i++) {
		c[i] = c[i] ^ a2[i];
	}
}
void changce_ni(char *a2, char *Dst, unsigned char *a3, signed int Size)
{

	signed int i; // edx

	char *t = (char *)malloc(sizeof(char)*Size);
	memset(t,0, Size);
	for (i = 0; i < Size; ++i)
		t[a3[i] - 1] = Dst[i];
	memcpy(a2, t, Size);
	free(t);
	//return memcpy(Dst, Src, Size);
}
void changce_ni_20h(char *a2, char *Dst, unsigned char *a3)
{

	signed int i; // edx

	char *t = (char *)malloc(sizeof(char)*0x20);
	memset(t, 0, 0x20);
	for (i = 0; i < 0x30; ++i)
		t[a3[i] - 1] = Dst[i];
	memcpy(a2, t, 0x20);
	free(t);
	//return memcpy(Dst, Src, Size);
}
unsigned int bin2dec(char *bin) {
	char dec = 0;
	dec = bin[3] + bin[2] * 2 + bin[1] * 2 * 2 + bin[0] * 2 * 2 * 2;
	return dec;
}
void unkonw(char *pcalc_f_20, char *d_t_l)
{
	char *v2; // edi
	int i; // esi
	char *dtl; // ebx
	signed int k; // ebx
	int v6; // ecx
	signed int j; // [esp+8h] [ebp-10h]

	v2 = pcalc_f_20;
	i = 0;
	dtl = d_t_l;
	changce(after_calc, pcalc_f_20, t3, 0x30);    // after_calc=0x408580

	xorf(after_calc, dtl, 0x30);
	j = 0;
	do
	{
		k = 0;
		v6 = table[16 * (4 * j + after_calc[i + 5] + 2 * after_calc[i])
			+ 2 * (after_calc[i + 3] + 2 * (after_calc[i + 2] + 2 * after_calc[i + 1]))
			+ after_calc[i + 4]];
		printf("j=%d,unkonw-dec=%d\n",j, v6);
		do
		{
			v2[4 * j - k++ + 3] = (v6 & 1) != 0;      // v2=4085d0
			v6 /= 2;                                  // to_bin
		} while (k <= 3);
		++j;
		i += 6;
	} while (j <= 7);
	changce(v2, v2, t4, 32);
}
int g = 0;
void unkonw_ni(char *pcalc_f_20, char *d_t_l)
{
	char *v2; // edi
	int i; // esi
	char *dtl; // ebx
	signed int k; // ebx
	int v6; // ecx
	signed int j; // [esp+8h] [ebp-10h]
	unsigned char temp[0x30] = { 0 };
	unsigned char temp_t[0x30] = { 0 };
	int found = 0;
	int s = 0;
	v2 = pcalc_f_20;
	i = 0;
	dtl = d_t_l;
	changce_ni(v2, v2, t4, 32);
	j = 0;
	do
	{
		int dec = bin2dec(v2);
		//printf("j=%d,unkonw_ni-dec=%d\n",j, dec);
		for (i = 0; i < 64; i++) {
			if (dec == (int)table[64 * j + i]) {
				found = i;
				//printf("Found:j=%d,i=%d,s0=%d\n", j, i, 64 * j + i);
				temp[4 + j * 6] = found % 2;
				found = found / 2;
				temp[j * 6 + 3] = found % 2;
				found = found / 2;
				temp[j * 6 + 2] = found % 2;
				found = found / 2;
				temp[j * 6 + 1] = found % 2;
				found = found / 2;
				temp[j * 6 + 5] = found % 2;
				found = found / 2;
				temp[j * 6] = found % 2;
				memcpy(temp_t, temp, 0x30);
				xorf((char *)temp_t, dtl, 0x30);
				changce_ni_20h((char *)temp_t, (char *)temp_t, t3);
				changce((char *)temp_t, (char *)temp_t, t3, 0x30);
				xorf((char *)temp_t, dtl, 0x30);
				if (memcmp(temp_t, temp, 0x20)==0) {
					printf("Found\n");
					g++;
					break;
				}
				//break;
			}
		}

		v2 += 4;
		j++;
	} while (j <= 7);
	xorf((char *)temp, dtl, 0x30);
	memcpy(after_calc,(char *)temp,0x30);
	changce_ni_20h(after_calc, after_calc, t3);
	//changce((char *)temp_t, (char *)temp_t, t3, 0x30);
	//memcpy(pcalc_f_20, after_calc, 0x20);
}
//char calc_f[64] = { 0 };

int *p_calc_f_20h;
int *p_calc_f;
int tail_calc_f_dd[8] = { 0 };
void testfuc() {
	unsigned char(*d_table_line)[48];
	int v4;
	int *v5;
	p_calc_f_20h = (int *)&calc_f[0x20];
	p_calc_f = (int *)calc_f;
	                       // 15*48 table

	d_table_line = d_table;
	int i_1 = 14;
	do
	{
		tail_calc_f_dd[0] = *p_calc_f_20h;          // hou 8 ge hou 16 byte-> hou 20H byte xia yi 20H
		tail_calc_f_dd[1] = p_calc_f_20h[1];
		tail_calc_f_dd[2] = p_calc_f_20h[2];
		tail_calc_f_dd[3] = p_calc_f_20h[3];
		tail_calc_f_dd[4] = p_calc_f_20h[4];
		tail_calc_f_dd[5] = p_calc_f_20h[5];
		tail_calc_f_dd[6] = p_calc_f_20h[6];
		tail_calc_f_dd[7] = p_calc_f_20h[7];
		v4 = (int)d_table_line;
		++d_table_line;                             // +0x30h
		unkonw((char *)p_calc_f_20h, (char *)v4);
		xorf ((char *)p_calc_f_20h, (char *)p_calc_f, 32);
		--i_1;
		v5 = p_calc_f;
		*p_calc_f = tail_calc_f_dd[0];
		v5[1] = tail_calc_f_dd[1];
		v5[2] = tail_calc_f_dd[2];
		v5[3] = tail_calc_f_dd[3];
		v5[4] = tail_calc_f_dd[4];
		v5[5] = tail_calc_f_dd[5];
		v5[6] = tail_calc_f_dd[6];
		v5[7] = tail_calc_f_dd[7];
	} while (i_1 >= 0);
	return;
}


void ni() {
	unsigned char(*d_table_line)[48];
	int v4;
	int *v5;
	p_calc_f_20h = (int *)&F[0x20];
	p_calc_f = (int *)F;
	// 15*48 table
	d_table_line = d_table+14;
	int i_1 = 14;
	do
	{
		v5 = p_calc_f;
		tail_calc_f_dd[0] = *p_calc_f;
		tail_calc_f_dd[1] = v5[1];
		tail_calc_f_dd[2] = v5[2];
		tail_calc_f_dd[3] = v5[3];
		tail_calc_f_dd[4] = v5[4];
		tail_calc_f_dd[5] = v5[5];
		tail_calc_f_dd[6] = v5[6];
		tail_calc_f_dd[7] = v5[7];

		v4 = (int)d_table_line;
		--d_table_line;                             // +0x30h
		unkonw_ni((char *)p_calc_f_20h, (char *)v4);                   // d_t_l=0x408040
		xorf((char *)p_calc_f_20h, (char *)p_calc_f, 32);
		--i_1;
		*p_calc_f_20h = tail_calc_f_dd[0];    // hou 8 ge hou 16 byte-> hou 20H byte xia yi 20H
		 p_calc_f_20h[1] =tail_calc_f_dd[1];
		 p_calc_f_20h[2] = tail_calc_f_dd[2];
		 p_calc_f_20h[3] = tail_calc_f_dd[3];
		 p_calc_f_20h[4] = tail_calc_f_dd[4];
		 p_calc_f_20h[5] = tail_calc_f_dd[5];
		 p_calc_f_20h[6] = tail_calc_f_dd[6];
		 p_calc_f_20h[7] = tail_calc_f_dd[7];
	} while (i_1 >= 0);

	return;
}
void work() {
	unsigned char(*d_table_line)[48];
	int v4;
	int *v5;
	unsigned char temp[0x40] = { 0 };
	p_calc_f_20h = (int *)&temp[0x20];
	p_calc_f = (int *)temp;
	// 15*48 table

	d_table_line = d_table;
	
	changce_ni((char *)temp, (char *)R, a0, 64);
	xorf((char *)p_calc_f, (char *)p_calc_f_20h, 0x20);
	unkonw_ni((char *)p_calc_f_20h, (char *)d_table[15]);
	//unkonw((char *)p_calc_f_20h, (char *)d_table[15]);
	int i_1 = 14;
	do
	{
		v5 = p_calc_f;
		tail_calc_f_dd[0] = *p_calc_f;
		tail_calc_f_dd[1] = v5[1];
		tail_calc_f_dd[2] = v5[2];
		tail_calc_f_dd[3] = v5[3];
		tail_calc_f_dd[4] = v5[4];
		tail_calc_f_dd[5] = v5[5];
		tail_calc_f_dd[6] = v5[6];
		tail_calc_f_dd[7] = v5[7];

		v4 = (int)d_table_line;
		--d_table_line;                             // +0x30h
		xorf((char *)p_calc_f_20h, (char *)p_calc_f, 32);
		unkonw_ni((char *)p_calc_f_20h, (char *)v4);                   // d_t_l=0x408040
		--i_1;
		*p_calc_f_20h = tail_calc_f_dd[0];    // hou 8 ge hou 16 byte-> hou 20H byte xia yi 20H
		p_calc_f_20h[1] = tail_calc_f_dd[1];
		p_calc_f_20h[2] = tail_calc_f_dd[2];
		p_calc_f_20h[3] = tail_calc_f_dd[3];
		p_calc_f_20h[4] = tail_calc_f_dd[4];
		p_calc_f_20h[5] = tail_calc_f_dd[5];
		p_calc_f_20h[6] = tail_calc_f_dd[6];
		p_calc_f_20h[7] = tail_calc_f_dd[7];
	} while (i_1 >= 0);
	changce_ni(Src1, (char *)temp, a3, 64);
	unsigned char flag[16] = { 0 };
	for (int i = 0; i < 8; i++) {
		flag[i] = Src1[8 * i + 7] + Src1[8 * i + 6] * 2 + Src1[8 * i + 5] * 4 + Src1[8 * i + 4] * 8 + Src1[8 * i + 3] * 16 + Src1[8 * i + 2] * 32 + Src1[8 * i + 1] * 64 + Src1[8 * i] * 128;
	}
	printf("g=%d\n", g);
	return;
}
int main()
{
	//testfuc();

	//ni();
	work();
	return 0;
}
貌似其中的table表和其中几个表都不是单射的,怎么倒推啊!!!!!!!!!!!。只有正着来才有可能吧,而且可能出现多解吧.

[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回