re题(37)BUUCTF-[GWCTF 2019]xxor

news2024/9/22 15:18:32

BUUCTF在线评测 (buuoj.cn)

用ida打开文件,ctrl+e定位main函数

也可以用shift+F12查找字符串,找与我们解题有关的字符串

通过字符串定位到引用字符串的函数

进入main entry 但还不是我们要分析的代码

进入__libc_start_main中的main参数,是我们要分析的代码

首先进入sub_400770

找到a1,也就是v7中存放的数据

用z3写个脚本

from z3 import *
a3, a4, a5 = Ints('a3 a4 a5')
x=Solver()
x.add(a3 - a4 == 2225223423)
x.add(a4 + a5 == 4201428739)
x.add(a3 - a5== 1121399208)

check=x.check()
print(check)

model=x.model()
print(model)

#sat
#[a5 = 2652626477, a3 = 3774025685, a4 = 1548802262]

得到结果

unsigned int a1[6] = { 3746099070,550153460, 3774025685 ,1548802262 ,2652626477 ,2230518816 };

 刚入门逆向的臭毛病是习惯Hide casts隐藏指针以清晰代码方便阅读的,但在本题中,倘若不留意类型而直接隐藏,在IDA窗口中将得到这样的数据:

//未隐藏指针的代码:注意到 v7 应该是一个unsigned int 数组
 if ( (unsigned int)sub_400770(v7, a2) != 1 )
  {
    puts("NO NO NO~ ");
    exit(0);
  }

显然,这些数据并不是标准的unsigned int类型,在获取这些数据时可以按h变为16进制进行存放

if ( a1[2] - a1[3] == 2225223423LL
    && a1[3] + a1[4] == 4201428739LL
    && a1[2] - a1[4] == 1121399208LL
    && *a1 == -548868226
    && a1[5] == -2064448480
    && a1[1] == 550153460 )

也可以从汇编窗口逐个获取并计算,且存放数组使用相应的类型

.text:00000000004007D0                 mov     [rbp+var_8], rax
.text:00000000004007D4                 mov     eax, 84A236FFh
.text:00000000004007D9                 cmp     [rbp+var_18], rax
.text:00000000004007DD                 jnz     short loc_400845
.text:00000000004007DF                 mov     eax, 0FA6CB703h
.text:00000000004007E4                 cmp     [rbp+var_10], rax
.text:00000000004007E8                 jnz     short loc_400845
.text:00000000004007EA                 cmp     [rbp+var_8], 42D731A8h
.text:00000000004007F2                 jnz     short loc_400845
.text:00000000004007F4                 mov     rax, [rbp+var_28]
.text:00000000004007F8                 mov     eax, [rax]
.text:00000000004007FA                 cmp     eax, 0DF48EF7Eh
.text:00000000004007FF                 jnz     short loc_400834
.text:0000000000400801                 mov     rax, [rbp+var_28]
.text:0000000000400805                 add     rax, 14h
.text:0000000000400809                 mov     eax, [rax]
.text:000000000040080B                 cmp     eax, 84F30420h
.text:0000000000400810                 jnz     short loc_400834
.text:0000000000400812                 mov     rax, [rbp+var_28]
.text:0000000000400816                 add     rax, 4
.text:000000000040081A                 mov     eax, [rax]
.text:000000000040081C                 cmp     eax, 20CAACF4h

    可以注意到,IDA中并没有为tmp1、tmp2声明变量(实际上,它们本不是这个名字,但为了方便阅读而被我改成了这个名字;从汇编窗口可以知道它们均为4个字节的变量(int))

  如下代码展示了LODWORD和HIDWORD的结果,乍一看似乎相当不同,但实际上这不过是一种比较别扭的写法罢了

    注意到tmp2的结果和a1[1]相同,而将a1[0]的类型换为int之后也将得到与tmp1相同的结果,也就是说,这两个函数并没有起到任何作用,只是做了简单的赋值罢了

    (尽管我想说具体问题具体分析,但倘若使用的是LOBYTE和HIBYTE的话,结果就将彻底不同了。但通常来说,出题人并不会特地去这样写,至少一般来说,并没有LODWORD这样的函数)

unsigned int a1[6] = { 3746099070,550153460, 3774025685 ,1548802262 ,2652626477 ,2230518816 };
int tmp1, tmp2;
tmp1 = LODWORD(a1[0]);// -548868226
tmp2 = HIDWORD(a1[1]);// 550153460

  

该汇编代码为for循环中对变量 j 的操作

    在C伪代码中可以看见为 j++,而在汇编中的结果显然应该是 j+=2,所以过于依赖伪代码的话在编写解密脚本时将遇到麻烦

    因此我们可以知道,这个循环每次获取 v6 中的两个进行加密并放入

  (应该记得,形参a1为输入流v6,a2为加密表{2,2,3,4}(DWORD类型数组每4字节一个,应将中间的0省略))

    分别获取 v3为第一个数组,v4为第二个数字,v5为一个轮替变量

    经过一个for循环后,将结果放回原数组

用c++写个脚本
 

#include<iostream>
using namespace std;
int main()
{	
	unsigned int a1[6] = { 3746099070,550153460, 3774025685 ,1548802262 ,2652626477 ,2230518816 };
	unsigned int table[4] = { 2,2,3,4 };
	unsigned int decode[6];
	int v5 = 1166789954 * (0x3F+1);
	unsigned int v3, v4;
	
	for (int i = 0; i <= 5; i+=2)
	{
		int v5 = 0x458BCD42 * 64;
		v3 = a1[i];
		v4 = a1[i + 1];
		for (int j = 0; j <= 0x3F; j++)
		{
			v4 -= (v3 + v5 + 20) ^ ((v3 << 6) + table[2]) ^ ((v3 >> 9) + table[3]) ^ 0x10;
			v3 -= (v4 + v5 + 11) ^ ((v4 << 6) + table[0]) ^ ((v4 >> 9) + table[1]) ^ 0x20;
			v5 -= 0x458BCD42;
		}
		decode[i] = v3;
		decode[i + 1] = v4;
	}
	for (int i = 0; i < 6; i++)
	{
		printf("%x", decode[i]);//666c61677b72655f69735f6772656174217d
	}
}
 
 

 

最终得到的decode数组便是flag,但由于VS默认显示为10进制数,所以应该将结果输出为16进制数并另外进行转换

unsigned int decode[6]={6712417, 6781810, 6643561, 7561063, 7497057, 7610749};

 

知识点:

根据变量类型和输入数据类型判断输入数据在变量中存储方式,如输入的是int 型变量是int64型。
dword可以实现取数据的低四位
HIDWORD函数与LODWORD函数分别取数据的高四位和低四位,HIWORD和LOWORD函数实现取数据的高两位和低两位

最后解出来a1数组,还要把数组变成十六进制,一个数据是6位十六进制数,6个数据就是36位16进制数,两个16进制数作为一个scaii可以变成一个字符,36个16进制数就是18个字符
c语言如何实现获取低四位和高四位

 

public int getHeight4(byte data){//获取高四位
    int height;
    height = ((data & 0xf0) >> 4);
    return height;
}
  
public int getLow4(byte data){//获取低四位
    int low;
    low = (data & 0x0f);//0x0f(00001111)
    return low;    
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++20 std::format

一、前言 1、传统 C 格式化的问题与挑战 可读性差&#xff1a;使用 C 中的 printf 和 scanf 家族函数进行格式化输出和输入时&#xff0c;它们的语法较为复杂&#xff0c;难以阅读。在较大的代码项目中&#xff0c;可读性差会导致维护困难。类型安全性差&#xff1a;printf 和…

IS-ISv4/6双栈

文章目录 IS-ISv4/6双栈实验要求配置 IS-ISv4/6双栈 实验要求 配置双栈 R1、2、3、4配置 IS-ISv4 和 IS-ISv6&#xff0c;配置IPv6多拓扑 上面为Level-1类型、中间为Level-1-2、下面是Level-2类型 还有就是说ATT位置1有一定要求连接L1/2连接L1或者L2类型路由器&#xff0c;至…

java23发布啦

2024年9月java23发布啦&#xff01;&#xff01;! JDK 23 提供了12 项增强功能&#xff0c;这些功能足以保证其自己的JDK 增强提案 - JEP &#xff0c;其中包括 8 项预览功能和 1 项孵化器功能。它们涵盖了对 Java 语言、API、性能和 JDK 中包含的工具的改进。除了 Java 平台上…

KVM环境下制作ubuntu qcow2格式镜像

如果是Ubuntu KVM环境是VMware虚拟机&#xff0c;需要CPU开启虚拟化 1、配置镜像源 wget -O /etc/apt/sources.list https://www.qingtongqing.cc/ubuntu/sources.list2、安装kvm qemu-img libvirt kvm虚拟化所需环境组件 apt -y install qemu-kvm virt-manager libvirt-da…

安装黑群晖,并使用NAS公网助手实现DDNS动态域名解析

很多人都会安装安装一个黑群晖进行练手&#xff0c;黑群晖有很多玩法和NAS套件&#xff0c;而且黑群晖安装比较简单&#xff0c;没有复杂的步骤&#xff0c;这也是很多人玩黑裙的理由&#xff0c;这里教大家如何安装黑群晖&#xff0c;并且安装神卓互联NAS公网助手实现DDNS动态…

arthas -- xxljob本地调试

方案一&#xff1a;测试类 package cn.wanda.wic.content.job.xxljob;import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;SpringBootTest public class ShopResourceMigrationJobTest {Reso…

C\C++内存管理详解

本次内容大纲&#xff1a; 1.C/C内存分布 大家看看下面的代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";char* pChar3 "abcd";int…

本地快速部署一个简洁美观的个人Halo博客网站并发布公网远程访问

文章目录 前言1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 前言 本文主要介绍如何在Cen…

【Python日记】好丝滑的贪吃蛇

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/39.htmlPython 贪吃蛇(pygame)前言部分代码完整代码 原文&#xff1a;https://blog.c12th.cn/archives/39.html Python 贪吃蛇(pygame) 前言 源代码参考B站: BV1cs411T7wW 效果展示 部分代码 框架 # 初始化 pygam…

基于微信小程序校园订餐的设计与开发+ssm(lw+演示+源码+运行)

摘 要 人民生活水平的提高就会造成生活节奏越来越快&#xff0c;很多人吃饭都采用点外卖的方式。现在点外卖的平台已有很多&#xff0c;大多都需要安装它们的APP才可以使用&#xff0c;并且没有针对校园。如果一味的使用外卖平台不仅会造成商家成本的增加&#xff0c;还不利于…

django应用JWT(JSON Web Token)实战

文章目录 一、什么是JWT二、为什么使用JWT三、在django项目中如何应用JWT1、安装djangorestframework-simplejwt库&#xff1a;2、在settings.py中配置JWT认证&#xff1a;3、在urls.py中配置JWT的获取和刷新路由&#xff1a; 四、JWT如何使用1、调用生成JWT的接口获取JWT2、客…

C++:类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)、RTTI

C&#xff1a;类型转换&#xff08;static_cast、reinterpret_cast、const_cast、dynamic_cast&#xff09;、RTTI 一、C语言类型转换二、C新增强制类型转换2.1 新增类型转换&#xff1a;static_cast2.2 新增类型转换&#xff1a; reinterpret_cast2.3 新增类型转换&#xff1a…

新手上路:在Windows CPU上安装Anaconda和PyCharm

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一. 确认自己是CPU为什么选择CPU教程&#xff1f;GPU与CPU的区别如何判断自己是CPU 二. Anaconda 安装包 和 Pycharm 安装包步骤1&#xff1a;下载Anaconda步骤2&am…

【d46】【Java】【力扣】234.回文链表

思路 判断是否是回文&#xff0c;需要&#xff1a;一个指针指向头&#xff0c;一个指针指向尾&#xff0c;两个指针一边向中间靠拢&#xff0c;一边判断数值是否相同 对于单链表&#xff0c;不方便获得pre&#xff0c;如果将节点放进 数组/list &#xff0c;数组/list可以直接…

2024年9月22日历史上的今天大事件早读

189年9月22日 &#xff08;汉灵帝中平六年八月戊辰&#xff09;大将军何进入宫&#xff0c;策划铲除宦官&#xff0c;事败被杀 1499年9月22日 瑞士独立。 1630年9月22日 明朝抗清将领袁崇焕被崇祯皇帝凌迟处死于北京 1776年9月22日 美国间谍黑尔未经审判即被处绞刑 1860年9…

buucft hashcat

使用文本编辑器打开时乱码 使用010editor打开发现时xml文档 拷贝到kali&#xff0c;使用binwalk查看&#xff0c;发现时xml文档&#xff0c;改后缀名为ppt。打开发现有密码 Accent OFFICE Password Recovery 64位-Office密码恢复软件 v20.09 免费版 - 下载吧 试试这个Accent O…

[云服务器14] 搭建属于你自己的Git服务器

Git是由Linux Torvalds开发的一个版本控制系统(VCS,Version Control System)&#xff0c;而目前最大的Git仓库托管公司就是大名鼎鼎的GitHub啦&#xff01; 而这次&#xff0c;我们主要讲在自己的服务器上&#xff0c;搭建一个GitLab驱动的Git服务器&#xff01; [请CSDN审核…

大模型的威力,远不只是聊天框

自2022年底ChatGPT发布以来&#xff0c;我们真正看到了大模型的威力&#xff0c;也引发了技术圈种种畅想。有相当一部分观点认为&#xff0c;大模型是一种工业革命级的产物&#xff0c;相信更多的人会和笔者一样&#xff0c;认为大模型是一个操作系统级的产品&#xff0c;会彻底…

基于波特图的控制系统设计算法

波特图&#xff08;Bode Plot&#xff09;是一种用于描述线性控制系统频率响应的图形表示方法&#xff0c;通常用于分析和设计控制系统。它以控制系统的传递函数&#xff08;或频域传递函数&#xff09;为基础&#xff0c;将系统的幅频特性&#xff08;振幅-频率响应&#xff0…

统信服务器操作系统【刻录镜像制作U盘启动盘的工具】

统信服务器操作系统各版本上刻录镜像制作U盘启动盘的工具方案 文章目录 应用场景一、问题现象二、问题分析解决方案应用场景 硬件/整机信息:全平台 CPU架构:全架构 OS版本信息:服务器a版,e版,d版(其中d版遇到的刻录类问题较少) 软件信息:dd工具、Fedora Media Writer工…