[GWCTF 2019]xxor

news/2025/1/16 6:40:20/文章来源:https://www.cnblogs.com/murasame520/p/18518179

[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!}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824706.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速幂和大数取模的简单运用(以SPOJ LASTDIG - The last digit为例)

题目描述原文Nestor was doing the work of his math class about three days but he is tired of make operations a lot and he should deliver his task tomorrow. His math’s teacher gives him two numbers a and b. The problem consist of finding the last digit of t…

从人员外包到测试工具、测试平台,提供全方位的测试解决方案~

随着学社的学员越来越多,影响力越来越大,不停有学员和企业问我们:能否提供人员外包服务?与此同时,企业对于外包人员的业务技能要求也越来越高,寻找一个稳定靠谱的供应商也成了很多学员所在公司的需求。对此,学社推出了专业的外包解决方案,有这方面的需求的学员和企业可…

Prometheus03 Prometheus服务发现, 各种exporter, 容器化监控, Federation联邦, VictoriaMetrics远程存储

6 服务发现 6.1 服务发现原理 6.2 文件服务发现#准备主机节点列表文件,可以支持yaml格式和json格式 #注意:此文件不建议就地编写生成,可能出现加载一部分的情况 cat targets/prometheus*.yaml - targets:- master1:9100labels:app: prometheus#修改prometheus配置文件自动加…

DRF

1.DRF组件 详细文档:见附件 1.1 Web应用模式 在开发web应用中,有两种应用模式: 1.前后端不分离【客户端看到的内容和所有页面效果都是由服务端提供出来的】2.前后端分离【把前端的界面效果(html,css,js分离到另一个服务端,Python服务端只需要返回数据即可)】 前端形成一…

css_repeating-linear-gradient

在不指定背景颜色渲染区间的情况下, repeating-linear-gradient与linear-gradient的没有区别<div class="test test1"></div> <div class="test test2"></div>.test {width: 150px;height: 150px;border: 1px solid #ccc;display:…

Vue组件化-插槽Slot

认识插槽Slot如何使用插槽slot?插槽的默认内容多个插槽的效果具名插槽的使用◼ 事实上,我们希望达到的效果是插槽对应的显示,这个时候我们就可以使用具名插槽:具名插槽顾名思义就是给插槽起一个名字,<slot> 元素有一个特殊的attribute:name;一个不带name 的sl…

柳凯的第二次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc/这个作业的目标 实现一个命令行文本计数统计程序。能正确统计导入的纯英文txt文本中的字符数,单词数,句子数。姓名-学号 柳凯-2022329301149码云地址:一、介绍本程序用于统计纯英文文本文件中的字符数、单词…

Linux服务器上报内存ecc错误怎么解决

​面对Linux服务器上报的内存ECC错误,可以按以下步骤进行处理:1.确认错误并收集相关信息;2.检查硬件和服务器日志;3.重新定位或替换内存模块;4.运行内存测试工具;5.更新硬件固件和操作系统。首先,我们需要确认错误并获取详细的故障描述。1.确认错误并收集相关信息 当服务…

Django-Ajax请求

1.Django-Ajax请求 1.2 介绍 客户端(浏览器)向服务端发起请求的形式:1.地址栏:GET 2.超链接标签:GET 3.form表单:GET或POST 4.Ajax(重要):GET或POST或PUT或DELETEAjax(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与…

ipv6使用上和ipv4有区别吗

IPv6与IPv4在使用上的主要区别包括:1.地址格式不同;2.地址空间更大;3.安全性增强;4.自动配置能力;5.数据包头部结构不同;6.路由选择优化;7.对多播和移动性的支持更好。IPv6的推出旨在解决IPv4地址耗尽问题,同时提高网络效率和安全性。IPv6的地址空间比IPv4大得多,提供…

IDEA 利用groovy脚本生成注释

介绍 本文主要介绍利用IDEA编辑器的活动模板,结合groovy脚本,生成注释模板。目前生成的注释主要适用于java和js文件 推荐此方式,可以根据需要定义groovy脚本,生成不同格式的注释操作点击 File >> Setting 找到 Edtor >> Live Temolates , 建议创建一个模板组…

TYPE-C PD浅谈(三)

由于TYPE-C两头都一样,没有方向性,所以在对接前并不会有电源输出,数据主从也尚未定义。在PD的规范内,针对装置对接,定义了三个电阻来进行对接的识别。 Rp:做为Provider需要在CC脚位上上拉一个Rp电阻。Rp电阻允许有三种阻值(pull high 5V时,10K/22K/56K),这三种阻值也同…