首页 > 其他分享 >WolvCTF2024 一道RE题目的分析

WolvCTF2024 一道RE题目的分析

时间:2024-03-20 20:55:31浏览次数:21  
标签:题目 eax mov rbp RE num rax var WolvCTF2024

doubledelete's revenge:

这道题给了两个附件:reveng1(elf)和一个未知格式文件 flag.txt.enc

hxd看一下这个文件

应该是加密过的文件

再来分析一下elf

程序逻辑是读取文件,然后进行加密,然后再写出文件,刚才那个 flag.txt.enc

加密过程:

fread(ptr, 1uLL, 0x30uLL, stream);          // 读取数据到ptr
    for ( i = 0; i <= 11; ++i )
      ptr[i] = __ROL4__(ptr[i], 13);

看伪代码猜测是读取的数据每四个字节循环左移13位,可以看一下汇编判断

loc_1260:
mov     eax, [rbp+var_5C]
shl     eax, 2
cdqe
lea     rdx, [rbp+ptr]
add     rax, rdx
mov     [rbp+var_48], rax
mov     rax, [rbp+var_48]
mov     eax, [rax]
rol     eax, 0Dh
mov     edx, eax
mov     rax, [rbp+var_48]
mov     [rax], edx
add     [rbp+var_5C], 1

确实是循环左移13位,那解密直接循环右移13位即可

f=open("flag.txt.enc","rb")
byte_data=f.read()
reversed_byte_data = byte_data[::-1]
def rol(num, bits):
    return ((num >> bits) | (num << (32-bits))) & 0xFFFFFFFF


data=[]
for i in range(0,len(byte_data),4):
    hex_data=int(reversed_byte_data[i:i+4].hex(),16)
    data.append(hex_data)
    print(hex(hex_data))

data.reverse()
flag=""
for num in data:
    new_num=rol(num,13)
    print(hex(new_num))
    by_data = new_num.to_bytes(4, byteorder='little')
    for i in by_data:
        flag+=chr(i)

print(flag)
#wctf{i_th1nk_y0u_m1sund3rst00d_h0w_r0t13_w0rk5}

 

标签:题目,eax,mov,rbp,RE,num,rax,var,WolvCTF2024
From: https://www.cnblogs.com/GGbomb/p/18085681

相关文章

  • Revit二次开发之 对象的隐藏与显示
    在revit开发中,我们经常要对特定元素进行演示和隐藏,但是由于隐藏的有多种不同的情况,我们来分析分析不同需要下的隐藏如何操作。1、隔离   通过隐藏和显示,能保证构件在任何区域都无法呈现,其API如下:IsolateCategoriesTemporary  隔离多个类别IsolateCategoryTemporary......
  • 20240315-1-逻辑题目
    逻辑题目逻辑题目现在也是面试中常考的题目,也不清楚面试出这种题目的意义,可能就是考察面试人员是否逻辑清晰.这种题目没有什么好的方法,除非你见过原题,否则,只能根据所给出的条件慢慢分析,尽量不要用常规思路,希望大家要跳跃思维.如果实在不行就给出一种解法,可能......
  • 【漏洞复现】Progress Kemp LoadMaster 命令注入漏洞(CVE-2024-1212)
    0x01产品简介ProgressKempLoadMaster是一款高性能的应用交付控制器,具有可扩展性,支持实体硬件和虚拟机的负载均衡。它提供了当今应用服务所需的各种功能,包括深度用户验证、资安防护(如WAF/IPS/DDoS防护)以及零信任架构服务。这款控制器旨在为各种规模的企业和单位提供出色的负......
  • Flume - [02] Spooling Directory Source
     一、概述  可以通过将文件放入磁盘上的"Spooldir"目录中来获取数据。此源会监视指定目录中的新文件,并在新文件出现时解析新文件中的事件。事件解析逻辑是可插入的。在将指定文件完全读取到通道后,默认情况下通过重命名文件来指示文件来指示完成,或者可以删除它,或者使用trac......
  • Linux下生成核心转储core
    为了方便进行分析调试,希望当程序发生崩溃或者收到SIGSEGV、SIGABRT等信号时,系统会生成相应的核心转储文件。核心转储大小限制首先,要检查核心转储的大小限制。可以使用ulimit命令来查看当前用户的核心转储大小限制:ulimit-c如果输出为0,则表示不生成核心转储文件。可以使......
  • 订单号规则,不能重复。redis去重 redis集合set应用
    订单号规则,不能重复。redis去重redis集合set应用redis锁定商品解决并发售卖问题RedisUtil工具类https://www.cnblogs.com/oktokeep/p/17917833.html需求背景:订单号根据日期反转加上随机数,订单号是否重复,前提是确保当天的订单号不重复,可以确保全局系统中的订单号不重复。//......
  • 2023 re:Invent | Amazon Q 与 Amazon CodeWhisperer 面向企业开发者提效利器
    2023年,以 GPT 为代表的生成式AI引爆了新一轮技术热潮,短短一年的时间内,生成式AI已经成为科技世界发展的核心。作为云计算的行业风向标盛会re,本届:Invent全球大会紧跟生成式AI浪潮,推出名为“AmazonQ”的生成式人工智能助手,同时AmazonCodeWhisperer这款用于IDE......
  • .forEach循环和.map()循环的主要区别,它们分别在什么情况下使用?
      .forEach()和.map()都是JavaScript数组的迭代方法,用于对数组中的每个元素执行某个操作。它们之间的主要区别在于返回值和使用情况。1.forEach()方法:  .forEach()方法用于遍历数组中的每个元素,并对每个元素执行指定的回调函数。该方法没有返回值,它仅用于执......
  • (C++20) jthread中stop_token的基础使用
    (C++20)jthread中stop_token的基础使用文章目录(C++20)jthread中stop_token的基础使用C++20jthread使用方式循环判断条件变量condition_variable_anystop回调std::stop_callbackENDC++20jthreadstd::jthread-cppreference.comstd::stop_token-cpprefere......
  • 大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning
    大模型主流微调训练方法总结LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning概述大模型微调(finetuning)以适应特定任务是一个复杂且计算密集型的过程。本文训练测试主要是基于主流的的微调方法:LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning,并对它们进行......