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)

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

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

相关文章

Haproxy 负载均衡集群

一. Haproxy : 1. Haproxy 介绍: HAProxy 是法国开发者威利塔罗 (Willy Tarreau) 在2000年使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障…

河南大学大数据平台技术实验报告二

大数据平台技术课程实验报告 实验二:HDFS操作实践 姓名:杨馥瑞 学号:2212080042 专业:数据科学与大数据技术 年级:2022级 主讲教师:林英豪 实验时间:2024年3月15日3点 至 2024年3月15日4点40 …

【矩阵】54. 螺旋矩阵【中等】

螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 解题思路 1、模拟顺时针螺旋顺序遍历矩阵…

完美解决 RabbitMQ可视化界面Overview不显示折线图和队列不显示Messages

问题场景: 今天使用docker部署了一个RabbitMQ,浏览器打开15672可视化页面发送消息后不显示Overview中的折线图,还有队列中的Messages,因为我要看队列中的消息数量。 解决方案: 进入容器内部 docker exec -it 容器id…

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

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

CommonJs规范

文章目录 1. CommonJS 模块的导出2. CommonJS 模块的导入2.1使用 require 函数导入文件模块(用户自定义)2.2使用 require 函数导入核心模块(Node.js 内置的模块)2.3文件夹作为模块2.4模块的原理 在node中,默认支持的模…

GPT-4引领AI新纪元,Claude3、Gemini、Sora能否跟上步伐?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚…

C语言——自定义类型——结构体(从零到一的跨越)

目录 前言 1.什么是结构体 2.结构体类型的声明 2.1结构体的声明 2.2结构体的创建和初始化 2.3结构成员访问操作符 2.3.1结构体成员直接访问 2.3.2结构体成员的间接访问 2.4结构体变量的重命名 2.5结构体的特殊声明 2.6结构的自引用 3.结构体内存对齐 3.1对齐规则 3…

JMH微基准测试框架学习笔记

一、简介 JMH(Java Microbenchmark Harness)是一个用于编写、构建和运行Java微基准测试的框架。它提供了丰富的注解和工具,用于精确控制测试的执行和结果测量,从而帮助我们深入了解代码的性能特性。 二、案例实战 在你的pom文件…

数据结构从入门到精通——直接选择排序

直接选择排序 前言一、选择排序的基本思想:二、直接选择排序三、直接选择排序的特性总结:四、直接选择排序的动画展示五、直接选择排序的代码展示test.c 六、直接选择排序的优化test.c 前言 直接选择排序是一种简单的排序算法。它的工作原理是每一次从未…

Hadoop大数据应用:HDFS 集群节点缩容

目录 一、实验 1.环境 2.HDFS 集群节点缩容 二、问题 1.数据迁移有哪些状态 2.数据迁移失败 一、实验 1.环境 (1)主机 表1 主机 主机架构软件版本IP备注hadoop NameNode (已部署) SecondaryNameNode (已部署…

Epuck2机器人固件更新及IP查询

文章目录 前言一、下载固件更新软件包:二、查询机器人在局域网下的IP 前言 前面进行了多机器人编队仿真包括集中式和分布式,最近打算在实物机器人上跑一跑之前的编队算法。但由于Epuck2机器人长时间没使用,故对其进行固件的更新,…

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念,为了更好地服务于客户…

CTF题型 匿名函数考法例题总结

CTF题型 匿名函数考法&例题总结 文章目录 CTF题型 匿名函数考法&例题总结一 .原理分析二 .重点匿名函数利用1.create_function()如何实现create_function代码注入 2.array_map()3.call_user_func()4.call_user_func_array()5.array_filter() 三.例题讲解1.[Polar 靶场 …

详细分析Python模块中的雪花算法(附模板)

目录 前言1. 基本知识2. 模板3. Demo 前言 分布式ID的生成推荐阅读:分布式ID生成方法的超详细分析(全) 1. 基本知识 Snowflake 算法是一种用于生成全局唯一 ID 的分布式算法,最初由 Twitter 设计并开源 它被设计用于解决分布式…

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

学生信息管理系统--修改信息(非常详细的修改,更新,撤销,删除逻辑)

目录 概述修改包括的操作修改在每个模块中的应用 详解修改与更新取消删除 特殊概念数据集游标 总结 概述 学生信息管理系统,功能相对简单且代码重复性高,应该采用复用的思想来减少代码的冗余和提高代码的可维护性。然而,对于基础入门项目来说…

wireshark数据捕获实验简述

Wireshark是一款开源的网络协议分析工具,它可以用于捕获和分析网络数据包。是一款很受欢迎的“网络显微镜”。 实验拓扑图: 实验基础配置: 服务器: ip:172.16.1.88 mask:255.255.255.0 r1: sys sysname r1 undo info enable in…

一文读懂!Mj AI作画是什么?5款Midjourney国内版软件必备!

mj ai 作画是什么? mj ai 作画,是 Midjourney ai 作画的缩写,这里的 Midjourney 是海外一款非常出名的 AI 绘画软件,其受欢迎程度和影响力之广,某种程度上让它成了 AI 作画的代名词,正如 ps 在平面设计领域…

D-Star 寻路算法

D-Star 寻路算法 下面简写 D-Star 为 D* D算法:D 算法”的名称源自 Dynamic A Star,最初由Anthony Stentz于“Optimal and Efficient Path Planning for Partially-Known Environments”中介绍。它是一种启发式的路径搜索算法, 适合面对周围环境未知或者…