CTF-reverse-每日练题-xxxorrr

题目链接

https://adworld.xctf.org.cn/challenges/list


题目详情

xxxorrr


解题报告

下载得到的文件使用ida64分析,如果报错就换ida32,得到分析结果,有main函数就先看main

main函数分析

v6

main函数中,v6的值是__readfsqword(0x28u)用于反调试

a2、a3与sub_916函数一起被作为sub_A90函数的参数

输入的字符串s与已经定义好的s1相互异或

s1

是一个定义好的字符串

sub_916函数分析

v1

v1用于反调试

除此外该函数只是对字符串s1和s2进行比对,如果相同则给出成功提示(flag引导),说明要从s1和s2着手,在main函数中对s1加密(与输入串s异或)后的结果需要和s2相同

s1&s2

发现这里的s1和main函数中的s1是同一个变量,这时碰到一个问题,sub_916函数在进行s1和s2的比对时,按照顺序结构的话,应该是先执行sub_916函数(即先比对s1和s2),再让s1和输入串s异或才对啊?可是如果是这样的执行顺序,就不可能使s1与s2相等,说明不是这样的执行顺序,应该是遗漏了某些条件,再回main函数中看看有一个还没分析的sub_A90函数

sub_A90函数分析

C 库函数 – atexit() | 菜鸟教程 (runoob.com)

这个函数直接给出了一个返回值__cxa_atexit函数,查阅资料后得知它的原型就算atexit()函数,而atexit()函数的作用是,当程序正常终止时,调用传入其中的函数

这下便恍然大悟,表面上看main函数中的sub_916函数在对字符串s1循环异或加密之前,而实际它是被作为参数传递给__cxa_atexit函数的,是在程序执行结束后才被调用

在完成以上的分析之后,博主一时也是认为稳如泰山,不曾料想按这个逆向思路去简单写了脚本却始终不能ctf,也是有了这题,让我养成一个习惯——对于关键加密串一定要仔细查看它的交叉引用!

选中s1后按x键查看交叉引用,赫然发现它在sub_84A函数也曾被引用过

sub_84A函数分析

跟进sub_84A函数,果不其然,发现这个函数也对s1进行过相关加密操作,但蒟蒻博主实在想不明白这个函数被调用的机理是什么,main函数中并没有对其调用过的痕迹,希望有清楚的大佬能够路过时指点一二!

最终我只能直接主观认为sub_84A函数是在main函数调用之前就被调用了

因此,在对比字符串s1和s2前,s1是被进行了两次加密,第一次是sub_84A函数的如下图的加密公式【s1[i] ^= 2 * i + 65】,第二次是main函数中的for循环与输入串s异或

EXP

先整理一下正向加密思路

经过加密1和加密2后的字符串s1和s2相同,逆向思路则为s2与完成第一次解密后的s1,去进行解密2

字符串s2处理

刚准备写脚本时突然发现这个s2不是常规的字符串啊,小白博主也不太明白为什么ida会这样分析,既有字符(ASCII码是十进制)又有十六进制数(h标志),所以这里得多做一步操作了——把字符串s2统一成相同的十六进制

把这些末尾有h标志的十六进制数先提取出来(注意结果要去掉h标志),各显神通吧,蒟蒻博主直接手抠了...

0x17, 0x46, 0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C, 0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0x77, 0x4F, 0x7A, 0x71, 0x43, 0x2B, 0x26, 0x89, 0xFE, 0x00

对s2前面的字符也做相同处理,这里可以用ida的【shift+e】快捷键快速获取

凑成一个总列表

s2 = [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46,0x17, 0x46, 0x54, 0x5A,0x59, 0x59,0x1F, 0x48, 0x32, 0x5B,
      0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0x77, 0x4F, 0x7A, 0x71, 0x43, 0x2B, 0x26, 0x89, 0xFE, 0x00]

最终脚本

(注意运行出的结果少一个右大括号,自行补上后提交正确)

s2 = [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46,0x17, 0x46, 0x54, 0x5A,0x59, 0x59,0x1F, 0x48, 0x32, 0x5B,
      0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0x77, 0x4F, 0x7A, 0x71, 0x43, 0x2B, 0x26, 0x89, 0xFE, 0x00]
s1 = 'qasxcytgsasxcvrefghnrfghnjedfgbhn'
flag = ''
for i in range(0, 33):
    #先对s1解密1,再拿s2和解密1后的s1进行解密2,得到的字符就是flag的一部分
    #同时注意python的字符不能直接当ASCII码来用
    flag += chr(s2[i] ^ ord(s1[i]) ^ (2 * i + 65) )
print(flag)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础学习笔记三

环境变量CLASSPATH classpath环境变量是隶属于java语言的,不是windows操作系统的,和PATH环境变量完全不同classpath环境变量是给classloader(类加载器)指路的java A 。执行后,先启动JVM, JVM启动classload…

聚类算法( clustering algorithm):

在前两章,我们学的是:线性回归,逻辑回归,深度学习(神经网络),决策树,随即森林算法。他们都是监督学习的例子。 在这一章里,我们将学习非监督学习的算法。 什么是聚类算法: 聚类算…

C语言结构体详解

1、结构体的声明 结构体是一些值的集合,这些值被称为成员变量。结构体中的每个成员可以是不同类型的变量。 语法: struct tag //关键词 标签 { member- list ;//成员清单 }variable- list ;//变量清单 通常结构体描述的是一个复杂对象,比…

【Linux】多线程概念 | POSIX线程库

文章目录 一、线程的概念1. 什么是线程Linux下并不存在真正的多线程,而是用进程模拟的!Linux没有真正意义上的线程相关的系统调用!原生线程库pthread 2. 线程和进程的联系和区别3. 线程的优点4. 线程的缺点5. 线程异常6. 线程用途 二、二级页…

2023 re:Invent | Amazon Q 与 Amazon CodeWhisperer 面向企业开发者提效利器

2023 年,以 GPT 为代表的生成式 AI 引爆了新一轮技术热潮,短短一年的时间内,生成式 AI 已经成为科技世界发展的核心。作为云计算的行业风向标盛会 re ,本届: Invent 全球大会紧跟生成式 AI 浪潮,推出名为“ Amazon Q ”…

【方法】想要修改PDF文件怎么办?

在工作上,我们经常需要用到PDF文件,但需要修改PDF时,有些小伙伴却不知道怎么办,那就一起来看看以下两个方法吧! 方法一:使用PDF编辑器 PDF文件可以通过PDF阅读器或者浏览器在线打开,但无法进行…

【DFS】第十三届蓝桥杯省赛C++ B组《扫雷》(C++)

【题目描述】 小明最近迷上了一款名为《扫雷》的游戏。 其中有一个关卡的任务如下: 在一个二维平面上放置着 n 个炸雷,第 i 个炸雷 (xi,yi,ri) 表示在坐标 (xi,yi) 处存在一个炸雷,它的爆炸范围是以半径为 ri 的一个圆。 为了顺利通过这片…

GIS设计与开发的学习笔记

目录 一、简答题 1.GeoDatabase数据模型结构类型与四种关系。 2.组件式GIS的基本思想是什么? 3.请简述创建空间书签的实现逻辑。 4.请问与地理要素编辑相关的类有哪些?(列举至少五个类) 5.利用ArcGIS Engine提供的栅格运算工…

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费管理系统软件V17.9为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、电玩体验馆管理软件在计时的同时可以设置定时提醒&…

大模型第一讲笔记

目录 1、人工智能基础概念全景介绍... 2 1.1 人工智能全景图... 2 1.2 人工智能历史... 2 1.3 人工智能——机器学习... 3 监督学习、非监督学习、强化学习、机器学习之间的关系... 3 监督学习... 4 无监督学习... 5 强化学习... 5 深度学习... 6 2、语言模型的发展及…

视频素材库app推荐的地方在哪里找?

视频素材库app推荐的地方在哪里?这是很多短视频创作者都会遇到的问题。别着急,今天我就来给大家介绍几个视频素材库app推荐的网站,让你的视频创作更加轻松有趣! 蛙学网:视频素材库app推荐的首选当然是蛙学网啦&#xf…

OKR如何与组织的整体战略和计划相结合?

OKR(Objectives and Key Results,目标与关键成果)作为一种流行的目标管理方法,正逐渐成为组织实现战略目标的重要手段。本文将探讨OKR如何与组织的整体战略和计划相结合,从而推动组织的持续发展。 首先,我…

dlib:人脸识别的魔法工具箱

引言 在数字化的世界中,人脸识别技术已经不再是科幻小说的专利,而是我们日常生活中的一部分。从解锁手机到机场安检,人脸识别技术正在逐步改变我们与世界的互动方式。而在这个领域中,有一个名为dlib的英雄,以其强大的功…

LLM之RAG实战(三十三)| 探索RAG在Table的应用

实现RAG是一个挑战,尤其是在有效解析和理解非结构化文档中的表格时,对于扫描的文档或图像格式的文档来说尤其困难。这些挑战至少有三个方面: 扫描文档或图像文档的复杂性,如其多元化的结构、非文本元素以及手写和打印内容的组合&…

前端基础篇-深入了解 Ajax 、Axios

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求,并获取服务器响应的数据。异步交互是指,可以在不…

InnoDB存储引擎中的锁(整理)

目录 什么是锁 InnoDB存储引擎中的锁 锁的类型 锁的兼容性 一致性非锁定读 一致性锁定读 锁的算法 行锁的三种算法 Phantom Problem(幻像问题) 锁问题 脏读 不可重复读 丢失更新 死锁 什么是锁 在数据库中锁是为了解决资源争抢的问题&…

Linux操作系统——多线程

1.线程特性 1.1线程优点 创建一个新线程的代价要比创建一个新进程小得多与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多线程占用的资源要比进程少很多能充分利用多处理器的可并行数量在等待慢速I/O操作结束的同时,程序可执行其他的计…

先进的人工智能促进更好的业务沟通

提升商务沟通效率:了解SaneBox智能电子邮件管理工具 在现代商业环境中,有效的沟通至关重要。 先进的人工智能技术,特别是在电子邮件管理方面,正在改变企业处理沟通的方式,提高效率和个性化。 下面,我们深入…

【1】THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER

0x01 问题描述 连接COM口连接不上,出现THIS IS NOT PROLIFIC PL2303. PLEASE CPMTACT YOUR SUPPLIER.如下图 0x02 问题解决 1、分析后,因为是windows 11 系统,就装一下驱动。右键单击--》属性 2、更新驱动程序--》浏览我的电脑以查找驱动程序…

电脑中了.[nicetomeetyou@onionmail.org].faust勒索病毒,关于数据恢复

文件后缀变成.[nicetomeetyouonionmail.org].faust了怎么办? 当文件后缀变成.[nicetomeetyouonionmail.org].faust时,通常意味着你的计算机系统已经受到了Faust勒索病毒的攻击。这种病毒会利用先进的加密算法对你的文件进行加密,并将文件后缀…