巅峰极客2024

news2024/12/16 10:41:55

Misc

Misc题搞得有点像re病毒分析,不过misc成分还是比较高

源文件有upx壳,脱完了获得的程序沙箱跑不出来

IDA分析一下发现有虚拟机检测,所以只能在本地运行

运行后释放了两个文件

图片其实在释放程序中能找到

file文件上传沙箱后显示是木马,释放了default程序

对file进行逆向分析,只发现了pupy这个字段

而且有大量python对象

但是直接搜这个项目没用,需要解码器项目

https://github.com/CaledoniaProject/pupyrat-config-decoder

配置python2环境,运行

28行报错

修改一下

运行时不要直接 ./,用 python2 main.py

IP地址就得到了

那图片有啥用呢,zsteg跑一下

看一下大小就知道和释放的file是一样的,实际上也确实如此

提取file的方式很多,就是分析需要你找到那个github项目的工具,难点主要在这里吧,当时也没找到

Re

伪代码很难看,动调翻一翻可以发现一些关键点

首先是239行

是最终密文比对的部分,238行也可以看到密文长度1280字节

然后是276行附近,明显是加密部分

出现大量sha256加密的API

之后就是大量的异或

513行,输入字符的限制

动调可以发现,整体逻辑大概是先113行scanf

然后飞到513附近验证输入字符

然后再飞到276行加密

加密完了还有一堆移动性的操作

哈希逆不起来,只能考虑爆破

动调看一下加密过程

加密部分断一下,看看phInput

看来是一次加密三个字节

注意要再循环一次

每次取三个字节,每个循环往后移动一个字节

然后找一下sha256加密的密文,应该在pbOutput里

&v107指向了第二个字节的地址

然后存到v14去异或

异或部分代码头尾参差不齐应该是反编译器分析的问题,if(v13)else也没什么影响,if和else的内容都一样。

加密的部分就是32字节的密文再去以后3字节循环的明文。

于是可以考虑三字节爆破

密文长1280字节,每一段sah256是32字节,就是64个hex字符

不过密文不是按明文顺序排列的,所以解密也不用考虑顺序,index能匹配到即可

爆出来乱序的三字节组,写个脚本进行排列即可

import hashlib
import itertools

enc = "EB74464F7924C56210CBFFC5A239BE0399ED2C8FB9542BA7C58A7E560F352CA03EE5E00A6EA938CF85F882C799D78BC682225428F4E556D047F15E5766855C04660DC72181954CF9976E5705CBAA483D2AAB5A69283D68E4F74C23CFA8C226D0F941E7F4FF9960F1DA677E9DBF9814B5B3E2D799074AC0120F212F3A52C37FE335D56DB4BD214600049F7F950C01FABD8625065607304F17AEF3C0F0177F9B3EBDE5663346606CB307F1645F006DB088F34F7D44BE9543A1393B29506D1D31814460FE7BAC48BDBB8E354128E7535CE73B1618C594D9D1B9BF7148A7D77077E9A7FFA0BE1CFA9800FE3364F9E7304557974045E0C950B8F3444432C16AB7DDEE371F6026FA2D6FC143598A9EE9E12736EABD515BAE24BB03E4C062DDC263F4A18C3E5C10A4CC88E19B04592B864AC883D8B994EEB2C46496B3416B000C9A344A4F3CF2C30DA6DD57B7D3701CDCB9418EAE8A0470C2AD2668ECF0E3AE6B6A29F6AE3C23E30F42571DFC507171D173F928718E2A5D18C43F7A5B20E125A6421EFBEFA5034BF44B5E66EF90124EE2CFFD9AACE7C49356A64ADFFBA0D44D29B125AB8E98386ED91129B0197AE9A642C173578EFD4784D1EE087CE765A714640F9AA867A4AD879229F1712037D522B5226B2DC7440EFCB753EC8A52C29CF1FB9BD85FA65FDA70B1261E143F9406D00D90AA0F55310652F3F908D7C1E5A841F77EBD3014FCA23CB223F8915D7730AFC7276F1C0FC7EA33A3083553D2684D964EC7E4A9205DEE6FCFEADA8B589CF48326AF2DEBF56DB42A4DFDF74BF9CB0A34BFD97B90B83E17E31FE0A48B54C94AC4175B46302D5E8B38D7CB42E618AEC9197D43B1B36891A18CDC5CA57F20284187FE6988D860ED46076F779B088D2FA78A798A55DCC6E657E8B101A23B9F8ADE02F696D905F63C626C3E07FD06002B2030B20FAFF02625D9B875A4B74DD421CCB5411CC309EBE7CC75BED408F9F486E6CFFF4F14AC36DFFB643C2721A3AD4CA95415D59CF3C3EE85FF75F2BC6FFD1FC09499544B7218F5937E8B73C7764DEBC840266B14F3D049AE9511AB135CC764C5C6F10C87C087BC8D3181D7470630D4A983FE401F46C99F4A52D81E8D4146211BFA28AE52C9D0E3974AFB2D830F443136F4464DDFEFA30688BE27A8A0158A85B8040C2C04598F2111751D296F862FFEBC2FB50D6530FE6C09D70F54664ED2F2C44365D647B3E6D5BB45707C8B18C8A248B153309605B34ED9CEF42172114F52AE47E8063131EFB2F1AD55868D648722111B00CFE2132463F9659AA1F8298ED2FBD1239071DC3ACF63661C77A5ACBB54410FF3F7CFA1701040BD2D2C8F721A37E310A84605845E7202DB021B2346A1BB920AE80DD0066F05A0524BC80339ED9932542883473FEFCA18C1C8B8C9B0E31B7169BAC1F1B9697B2799BDB869006C16C49B77525AB7546FE3345E5F01A5E248FB966B7592D2A0DA0BED3E27F6C789647FDE73F59258FFC6A638758661126FC03D24226DA7295EBDF50C52D96631B5804D02CDF2DC89FA6063CA2D00953200BED4BF734CEDBA0C56A185C46CB60ABCDD8C611E4203B4E0F217FA14389FB1A49C03180CC616C730FA48B1B96EB17D7B3BDFD9B6A7D646A57C976DD592A3F022A15399A1C37140E1897B231918DC2F2257DD2CC33FADEF99939CE9EB676674458ED487984E9F8D2C7DF23D8093940FEAB586D0E674B6B2416125DED9C2386A247F1D87BAD1CAB640579EAE3050FFD0A8AEDF52254AA5E9186F060C97150EC26626CC8451C47569764B281667A54428E096A20A5D81EB4D"
enc_list = [enc[i:i+64] for i in range(0, len(enc), 64)]  # 40

def encrypt(data):
    data_bytes = data.encode()
    sha256_hash = hashlib.sha256()
    sha256_hash.update(data_bytes)
    hash_bytes = sha256_hash.digest()
    result = bytearray()
    for i in range(len(hash_bytes)):
        result.append(data_bytes[i % len(data_bytes)] ^ hash_bytes[i % len(hash_bytes)])
    return result

flag_list = []
char_list = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-{}"
for data in itertools.product(char_list, repeat=3):
    data = ''.join(data)
    enc_result = encrypt(data)
    enc_result = enc_result.hex().upper()
    try:
        index = enc_list.index(enc_result)
        flag_list.append(data)
    except ValueError:
        pass

print(flag_list)

# 初始化 current 为 "fla"
current = "fla"

# 找到起始点 "fla" 的索引
start_index = flag_list.index('fla')

# 从起始点开始遍历
i = start_index
while i < len(flag_list):
    # 检查当前元素的前两个字符是否与 current 的后两个字符相同
    if flag_list[i][:2] == current[-2:]:
        # 将当前元素的第三个字符附加到 current 后面
        current += flag_list[i][2]
        # 重置索引,从头开始寻找下一个匹配的元素
        i = 0
    else:
        i += 1

# 输出最终结果
print(current)
#flag{194a39a4-7937-48fb-bfea-80bd17729f8a}

关于密文排列的乱序,可以猜测应该是密文按照二叉搜索树的数据结构进行了存储

GPT姥爷如是说:

用MLM优化也能看出一些端倪:

int main() {
    std::cout << "Input flag:";
    std::string flag;
    std::cin >> flag;
    std::list<std::string> list;
    for (int i = 0; i < flag.size() - 2; i++) {
        if (!((flag[i] >= '0' && flag[i] <= '9') ||
          (flag[i] >= 'a' && flag[i] <= 'z') || flag[i] == '-' ||
          flag[i] == '}')) {
            std::cout << "Error." << std::endl;
            return 0;
        }
    }
    for (int i = 0; i < flag.size() - 2; i++) {
        std::string str;
        get_hash(flag, str, i);
        BCRYPT_ALG_HANDLE phAlgorithm;
        BCRYPT_HASH_HANDLE phHash;
        UCHAR pbHash[32];
        BCryptOpenAlgorithmProvider(&phAlgorithm, BCRYPT_SHA256_ALGORITHM, NULL, 0);
        BCryptCreateHash(phAlgorithm, &phHash, NULL, 0, NULL, 0, 0);
        BCryptHashData(phHash, (PUCHAR)str.c_str(), str.size(), 0);
        BCryptFinishHash(phHash, pbHash, sizeof(pbHash), 0);
        BCryptDestroyHash(phHash);
        BCryptCloseAlgorithmProvider(phAlgorithm, 0);
        UCHAR pbHash2[32];
        for (int j = 0; j < 32; j++) {
            pbHash2[j] = pbHash[j];
        }
        for (int j = 2; j < 32; j++) {
            pbHash2[j] ^= str[j % str.size()];
        }
        for (int j = 2; j < 32; j++) {
            pbHash2[j] ^= pbHash[j % 32];
        }
        std::string hash = std::string((char*)pbHash2, 32);
        if (list.count(hash) != 0) {
            std::cout << "Error." << std::endl;
            return 0;
        }
        list.push_back(hash);
    }
    std::string result;
    std::list<std::string>::iterator it;
    for (it = list.begin(); it != list.end(); it++) {
        result += *it;
    }
    std::string flag2 = decrypt(result);
    if (flag2 ==
      "right,flag is your input!") {
        std::cout << "right,flag is your input!" << std::endl;
    } else {
        std::cout << "Error." << std::endl;
    }
    return 0;
}

it = list.begin(); it != list.end()这样的代码也有一定的参考意义

大致能看出这部分的代码是把新生成的哈希和已有的密文进行比对,小的放前面,大的放后面

二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:

  1. 非空左子树的所有键值小于其根结点的键值。
  2. 非空右子树的所有键值大于其根结点的键值。
  3. 左、右子树都是二叉搜索树。

正好符合二叉搜索树的定义,不过还原树对这一题解密意义不大,因为有明显的特征可以直接拼接。

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

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

相关文章

gorm源码解析(二):核心设计与初始化

文章目录 前言基本使用初始化db实例定义model增删改查 数据结构gorm.DBStatementSchema元数据clone 初始化初始化DB初始化dialector用dialector初始化db注册crud函数执行器processor注册callback Clause抽象解析元数据解析schema解析field 总结 前言 上一篇文章介绍了什么是OR…

科研绘图系列:R语言绘制网络图和密度分布图(network density plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…

CSS学习第二天

HTML文本颜色 颜色属性被用来设置文字的颜色&#xff0c;颜色通过css最经常的指定&#xff1a; #FF000&#xff1b;RGB&#xff08;255&#xff0c;0&#xff0c;0&#xff09;&#xff1b;颜色的名称red 一个网页的背景颜色是指在主体内的选择 文本的对齐方式 文本排列属性是…

springboot437校园悬赏任务平台(论文+源码)_kaic

摘 要 使用旧方法对校园悬赏任务平台的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园悬赏任务平台的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的校…

医学分割数据集白内障严重程度分割数据集labelme格式719张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;719 标注数量(json文件个数)&#xff1a;719 标注类别数&#xff1a;3 标注类别名称:["normal","severe","mi…

搭建Tomcat(二)--反射的应用

引入 Tomcat 在处理HTTP请求时&#xff0c;会根据一系列规则和配置来判断该请求是想要获取动态资源还是静态资源。 为什么要对请求进行判断&#xff1f; Tomcat 判断HTTP请求是动态请求还是静态请求的主要目的是确定如何生成并返回响应内容。静态请求通常意味着服务器只需读取并…

电子科技大学考研,计算机与软件专业怎么选择?

电子科技大学在计算机与软件领域具备卓越实力&#xff0c;其毕业生就业前景及薪资水平均颇为可观。因此&#xff0c;学生应依据个人课程专长来选定专业。若各项课程均表现出色&#xff0c;推荐25届考生优先考虑软件专业&#xff0c;因其上岸难度相对较低。 接下来&#xff0c;C…

部署GitLab服务器

文章目录 环境准备GitLab部署GitLab服务器GitLab中主要的概念客户端上传代码到gitlab服务器CI-CD概述软件程序上线流程安装Jenkins服务器 配置jenkins软件版本管理配置jenkins访问gitlab远程仓库下载到子目录部署代码到web服务器自动化部署流程 配置共享服务器配置jenkins把git…

Python中的优化函数2:cvxpy包

文章目录 介绍使用步骤示例1示例2官方文档 介绍 它是一个基于 Python 的凸优化建模工具&#xff0c;专门用于定义和求解 凸优化问题&#xff08;Convex Optimization Problems&#xff09;。CVXPY 提供了一种直观的方式来表达优化问题&#xff0c;并通过高效的求解器来解决这些…

MSciNLI—— 针对科学自然语言推理任务提出的多样化数据集用于训练语言模型和大规模语言模型建立基线

概述 论文地址&#xff1a;https://arxiv.org/pdf/2404.08066 源码地址&#xff1a;https://github.com/msadat3/mscinli 自然语言推理&#xff08;NLI&#xff09;是一项识别两个句子之间语义关系的任务。第一个句子称为 “前提”&#xff0c;第二个句子称为 “假设”。传统的…

REVERSE-COMPETITION-CISCN-2025

REVERSE-COMPETITION-CISCN-2025 rand0mezCskydumpcython rand0m 3.12版本的pyd逆向 读16进制&#xff0c;分成4个4字节的int&#xff0c;每个int做两步运算 第一步&#xff0c;右移28bit&#xff0c;左移4bit&#xff0c;然后拼接 注意左移4bit后又&0x3a3affff&#xff0…

批量合并多个Excel到一个文件

工作中&#xff0c;我们经常需要将多个Excel的数据进行合并&#xff0c;很多插件都可以做这个功能。但是今天我们将介绍一个完全免费的独立软件【非插件】&#xff0c;来更加方便的实现这个功能。 准备Excel 这里我们准备了两张待合并的Excel文件 的卢易表 打开的卢易表软件…

【算法】—— 前缀和

一、区间求和问题 给定一个长度为n的序列a&#xff0c;有m次查询&#xff0c;每次查询输出一个连续区间的和。 使用暴力做法求解是将每次查询都遍历该区间求和 //暴力做法import java.util.Scanner;public class Test {public static void main(String[] args){Scanner scan…

股市投资策略升级:掌握马尔可夫决策过程与强化学习,提升交易技能

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;本文将深入探讨马尔可夫决策过程&#xff08;MDP&#xff09;和强化学习在股票交易中的运用。通过阐述MDP的基本原理和其在交易策略中的实际应用&#xff0c;试图向您揭示这些…

jvm结构介绍

1. 垃圾回收&#xff08;Garbage Collection, GC&#xff09;&#xff1a;JVM自动管理内存的机制&#xff0c;负责回收不再使用的对象占用的内存空间。常见的垃圾回收算法包括标记-清除&#xff08;Mark-Sweep&#xff09;、复制&#xff08;Copying&#xff09;、标记-整理&am…

基于智能电能表的智能家居能源管理系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 电能测量模块数据传输模块能源管理模块控制算法 数据采集与处理算法能源优化算法代码实现 电能测量模块实现数据传输模块实现系统调试与优化结论与展望 1. 引言 随着智能家居的发展&#xff0c;电能管理成为智能家居系统中的…

【计算机组成原理】实验二:通用寄存器单元实验

实验二&#xff1a;通用寄存器单元实验 一、实验目的 了解通用寄存器的组成和硬件电路&#xff0c;利用通用寄存器实现数据的置数、左移、右移等功能。 二、实验内容 数据输入通用寄存器 寄存器内容无进位位左移实验 寄存器内容无进位位右移实验 三、实验步骤和结果 实…

codeforces一些题目思路复盘

codeforces round 919 dv2 C Partitioning the Array 大致题意&#xff0c;对于n约数i&#xff0c;我们把原数组分成份&#xff0c;并且每份中有i个元素&#xff0c;对于每个分组情况&#xff0c;如果存在一个数m使得数组中元素modm后使得每个部分的数组完全相同&#xff0c;如…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(四) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

又细又长的马尾:tail

英语里边有一个单词 tail&#xff0c;意为“尾巴”&#xff0c;这应当是众所周知的事情了。 不过&#xff0c;tail 这条尾巴&#xff0c;并不简单&#xff0c;因为它还是一个词根&#xff0c;也就是说 tail 其实是自由词素。 事实上&#xff0c;tail 最初来自 马尾 这样一个概…