每日一题----[GWCTF 2019]xxor题解

1、经典查壳:

64位无壳ELF软件

2、IDA启动:

找到main函数

经典的输入加密比较系列

3、加密函数:

还是从比较入手,然后这是一个TEA加密,进去看看

对于这种加密,我们只需要将其反过来就行,v5要取加密完之后的值作为解密的初值

4、比较函数:

瞅一眼比较函数的内容:

对于这个函数,我们使用z3将其求解出来:
代码:
 

from z3 import *
s=Solver()
a1= [Int(('%d' % i)) for i in range(6)]
s.add(a1[2]-a1[3]==2225223423)
s.add(a1[3]+a1[4]==4201428739)
s.add(a1[2]-a1[4]==1121399208)
s.add(a1[0]==-548868226)
s.add(a1[5]==-2064448480)
s.add(a1[1]==550153460)

s.check()
result=s.model()
print(result)

回头来看加密函数的解密:

外层一个for循环,内层一个for循环:

给一下解密代码:

5、解密代码:

#include <iostream>
using namespace std;

int main() {
	int data[6] = { 3746099070,550153460,3774025685,1548802262,2652626477,2230518816 };
	unsigned int tmp1, tmp2;
	unsigned int v3, v4;
	int key[4] = { 2,2,3,4 };
	for (int i = 0; i < 5; i +=2) {
		v3 = data[i];
		v4 = data[i + 1];
		int v5 = 1166789954 * 64;
		for (int j = 0; j < 64; ++j)
		{
			 
			v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + key[2]) ^ ((v3 >> 9) + key[3]) ^ 0x10;
			v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + key[0]) ^ ((v4 >> 9) + key[1]) ^ 0x20;
			
			v5 -= 1166789954;
		}

		data[i] = v3;
		data[i + 1] = v4;
	}
	
	
	for (unsigned int i = 0; i < 6; i++)
		printf("%c%c%c", *((char*)&data[i] + 2), *((char*)&data[i] + 1), *(char*)&data[i]);
}

至此,解密完成,答案是:
flag{re_is_great!}

总结:

增强了对z3的使用,了解到了TEA类似的解密


 

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值