首页 > 其他分享 >[GWCTF 2019]xxor

[GWCTF 2019]xxor

时间:2024-10-31 16:19:54浏览次数:1  
标签:int xxor unsigned GWCTF 2019 x2 x3 tmp1 x4

[GWCTF 2019]xxor

首先可以到汇编界面从新定义(U+P)一下main函数,不然看着会有点乱

分析

image-20241031153217983

追踪input变量

可以看到每次循环是获取四字节的输入

但后面对于tmp变量的赋值我就有点看不懂了,不要紧,直接动调

动态调试

连接linux,下断点开调

image-20241031153509740

我不知道为什么输入字符会直接跳出循环,所以输入了数字

F8步过

image-20241031153551690

可以看到tmp1tmp2被赋值了第一次输入和第二次输入

分析tea_encode

image-20241031154643957

我们可以继续动调下去,可以看到v0和v1分别被赋值了tmp1tmp2的值,会这样的原因是(unsigned int *)&tmp1,这里tea_encode函数调用的是tmp1的地址,而tmp1tmp2的地址仅相差4字节,在使用a1[1]时,其实是a1的地址加上一个unsigned int指针的大小,即四字节,刚好就是tmp2的地址,这下就明白是如何赋值的了

继续跟进看如何赋值

此时tmp1tmp2加密后的值是这样image-20241031155321233

再看看v4是如何赋值的

image-20241031155350888

是将tmp2作为高地址,tmp1作为低地址拼接起来

按F4完成循环,v4进行了三次这样的赋值

image-20241031155540980

最后在sub_400770函数中进行比较

image-20241031155753051

这里a1是个_DWORD指针,类似与unsigned int指针,所以每次调用v4中四个字节的值

编写脚本

现在算是分析完了,把sub_400770函数中的值进行以每两组代入tea_encode就可以解出flag了

z3求解

from z3 import *

x2, x3, x4 = Ints('x2 x3 x4')
s = Solver()
s.add(x2 - x3 == 0x84A236FF)
s.add(x3 + x4 == 0xFA6CB703)
s.add(x2 - x4 == 0x42D731A8)

if s.check() == sat:
    result = s.model()
    # 转换为 Python 整数
    x2 = hex(result[x2].as_long())
    x3 = hex(result[x3].as_long())
    x4 = hex(result[x4].as_long())
print(x2, x3, x4)

魔改tea加密求解

tea对称加密,魔改轮数和加密算法,进行三轮加密

#include <iostream>
using namespace std;
int main() {
	unsigned int v[6] = { 0xDF48EF7E, 0x20CAACF4, 0xe0f30fd5, 0x5c50d8d6, 0x9e1bde2d, 0x84F30420 };
	int key[4] = { 2, 2, 3, 4 };
	int r = 64;
	for (int i = 0; i < 6; i += 2) {
		unsigned int v0 = v[i];
		unsigned int v1 = v[i + 1];
		unsigned int sum = 0x458BCD42 * r;
		for (int j = 0; j < r; j++) {
			v1 -= (v0 + sum + 20) ^ ((v0 << 6) + key[2]) ^ ((v0 >> 9) + key[3]) ^ 0x10;
			v0 -= (v1 + sum + 11) ^ ((v1 << 6) + *key) ^ ((v1 >> 9) + key[1]) ^ 0x20;
			sum -= 0x458BCD42;	
		}
		v[i] = v0;
		v[i + 1] = v1;
	}for (unsigned int i = 0; i < 6; i++) { 
		for (unsigned int j = 2; j < 3; j--) {    //转为大端序
			printf("%c", *((char*)&v[i] + j));   
		}
	}
}

解出flag flag{re_is_great!}

标签:int,xxor,unsigned,GWCTF,2019,x2,x3,tmp1,x4
From: https://www.cnblogs.com/murasame520/p/18518179

相关文章

  • Windows Server 2019 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2019OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWin......
  • Windows Server 2019 中文版、英文版下载 (updated Oct 2024)
    WindowsServer2019中文版、英文版下载(updatedOct2024)WindowsServer2019Version1809请访问原文链接:https://sysin.org/blog/windows-server-2019/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org本站将不定期发布官方原版风格月度更新ISO。WindowsSe......
  • 2024.10.4 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest
    比赛链接Solved:7/11Penalty:914Rank:1/74Rank(vp):63/1k+Dirt:22%G答案是4*纯色块数+5。考虑怎么维护这个纯色块数。这道题的修改保证了一个块纯色当且仅当其行列都纯色。因此对行列分别维护一棵线段树,维护每一层分别有多少个纯色节点,按层乘起来相加就行。K1操作的增加量......
  • 题解:P7306 [COCI2018-2019#1] Strah
    分享一个\(O(nm\logm)\)的方法。分析考虑每次在\(x\)轴上固定左端点,然后移动\(x\)轴上的右端点,并统计答案。考虑如何统计一个\(1\timesn\)的区域的贡献。显然长度为\(i\)的区间有\(n-i+1\)个,所以贡献即为:\[\begin{aligned}f(n)=&\sum^n_{i=1}i\left(n-i+1\ri......
  • [GXYCTF 2019]Ping Ping Ping 题解(多种解题方式)
    知识点:命令执行linux空格绕过反引号绕过      变量绕过         base64编码绕过打开页面提示"听说php可以执行系统函数?我来康康"然后输入框内提示输入bjut.edu.cn  输入之后回显信息,是ping这个网址的信息 输入127.0.0.1因为提示是命令......
  • C#的vs2019项目打包安装程序exe
    C#的vs2019项目打包安装程序exe1.在扩展插中安装插件在Nget包管理器中搜索如下名字的插件MicrosoftVisualStudioInstallProjects点击安装后重启vs20192.创建SetupProject项目完成安装后点击项目中新建项,创建SetupProject的项目创建完成后点击图中步骤添加文件,将你......
  • [HDCTF2019]Maze
    [HDCTF2019]Maze去壳去upx壳upx-dmaze_behind_junk.exe去花对main_按U取消定义函数,按P重新分析函数分析很简洁的迷宫程序(5,-4)应该就是终点点进汇编界面,可以看到疑似地图的字符串+应该是起点,F是终点编写脚本求地图长宽maze='*******+*****************......
  • [2019红帽杯]easyRE WP
    [2019红帽杯]easyRE查壳无壳,64位elf文件分析首先没找到什么有用的函数,用shift+12搜索字符串定位这个字符串x追踪到函数首先关注这里第一个for循环,按tab到汇编界面查看这是个简单的异或,写一下脚本a=[73,111,100,108,62,81,110,98,40,111,99,121,127,121,46,......
  • 【套题】大沥2019年真题——第5题
    05.魔术数组题目描述一个N行N列的二维数组,如果它满足如下的特性,则成为“魔术数组”:1、从二维数组任意选出N个整数。2、选出的N个整数都是在不同的行且在不同的列。3、在满足上述两个条件下,任意选出来的N个整数的总和都是相等的。例如,这是一个4×4的二维数组:......
  • P5661 [CSP-J2019] 公交换乘 题解
    模拟"公交换乘"按题意模拟即可.注意:可以使用结构体,但是超过时间的优惠券需要被忽略.代码#include<iostream>#include<cstdio>usingnamespacestd;structnode{ intprice,deadline,is_use;//价格,截止时间,是否使用过}a[100005];intn,p,ans,pos=1;int......