HNCTF——maybe_xor

H&NCTF 2024 官方WP (qq.com)

这道题也是让我学到了re的新姿势啊

实例题

PS D:\ForCode\pythoncode\.idea> nc hnctf.yuanshen.life 33255
I am about to send you 128 base64-encoded ELF files, which load a value onto the stack, then do an XOR operation.
But I forgot to write the value after the XOR back onto the stack. Can you send back the value after XOR as a hex string for me?
You must analyze them all in under 120 seconds
Let's start with a warmup
ELF:  f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeIAECAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAABAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAgAQIAAAAAACABAgAAAAAJAQAAAAAAAAkBAAAAAAAAAAQAAAAAAAASIPsGEiNNekBAABIiee5GAAAAPOkSDHJigQMNL1Ig8EBigQMNLBIg8EBigQMNP1Ig8EBigQMNKFIg8EBigQMNG5Ig8EBigQMNCJIg8EBigQMNPZIg8EBigQMNCZIg8EBigQMNP5Ig8EBigQMNGBIg8EBigQMNHZIg8EBigQMNBlIg8EBigQMNCFIg8EBigQMNJhIg8EBigQMNAJIg8EBigQMNEFIg8EBigQMNGJIg8EBigQMNCtIg8EBigQMNKZIg8EBigQMNCJIg8EBigQMNKNIg8EBigQMNKFIg8EBigQMNCxIg8EBigQMNAFIg8EBuDwAAAAPBZukuo0Dd2M3ddipTN1oVQ+JEouBBIQ9vZH+PYJK7hzxrtaVISiZPOtgXvYySV00G2jbBDcEnTMG3R913XeWjZxVSPHLItAjRjl5I0MT5bEayW2V7Mgb3RUVMMnD5hAYqjIIEch6AgQUEIkC6rw8EvhcQ02Yq1dPlrdrPuUCG6v2470ZaY5uySCfuCFIaQhcgZmoW6qUhF1xbltno3zUs2gk5wqIHoTzFH64S9M6qQ1EL7Rd1+v/5DQNWBD5QdKIZVp5QLn6gqPmkWncQ8OnGk6eWyUi7W9lu+t94lO/TJ3HQET4oIuszyoi/oRJY563cs4Et91e92sOKPoW7FbRsG3agk5Vyy7H03EXY4AaIiebsCOPUaKOtIWpTwZIPDaTilhhnoS0dLOR0Salo3IyQJ52iZRku7mX
XoCFnY4KVpHRdIZhk7uPI4sO3L0qrpqWUJAa4YLtdxn1RffnwWsgs9vOhD9acq1htzHZ+WfZu3GriuexCcTqo/OY4ejMK26ZGuoUPISlUbjD6w1aPkvya2ISQ9HAQkmORTftpMuPCG0RUId9NAdaVD0xURwZ4e6SUhEqm9aeDvFX0qxr5QfYao
kgJxJZTllq2OFoYU9mNY2rIeWs6HmrXXm/r1LrKf/AgyKjcdhpj4mycF3el+xGxM1r/ksPe4F5yYS41lagQrP4rdHrJEnIoTQ35P5254QBhTdirzwlWBn2Fs8PLnLca91v+wsBFY6hFD7NbBEmpgSU1rg9xG4/MMHbTqsKAGBTh4NRS8qbrbbKBEKSwSYiDV1rEXbPzbILLL2L4vF280A9uqhuEeNTX6iHNY2DBuQNgOnCNWiJxuWub+Xe1OzUbwR3RjHjZyfENDCD9QVnGTMfJH7uCHrZC2sBjj3lhlzOo60UWKs3+QGrM2hUU3P2USBOjbIUKQ==
Expected bytes: 6c00907bec6ca3edd0a7a56836fb825b400c3d92802e7da3
Bytes?
 

 就是xor操作,然后给你的elf文件base64解码

cyber解码然后保存

一个正常elf文件

就是这里,一共24个

然后这里就是原文

import idc
ea = 0x08048093  # 起始地址
enc = 0x0008048274
v = [get_wide_byte(enc+i)for i in range(24)]def next_aim(n):# 获取下一条目的地址的指令global eafor i in range(n):ea = idc.next_head(ea)
key = []
for i in range(24):# 获取几个字符alp = idc.get_operand_value(ea,1) # 获取字符操作key.append(alp)next_aim(3)flag = ''
for i in range(len(key)):flag += ''.join(hex(v[i] ^ key[i])[2:].zfill(2))
print(flag)

这里就是一次得到的密文,你输入后

服务器会又给你这样的elf文件,一共有120多个,我的天

然后就是编写自动化脚本

我不会》。直接抄

from qiling import *
from qiling.const import QL_VERBOSE
from pwn import *
from Crypto.Util.number import *xor_key = []def hook_code(ql, address, size, user_data):buf = ql.mem.read(address, size)asm = next(user_data.disasm(buf, address))x = f"{asm.mnemonic} {asm.op_str}"if 'xor' in x and 'al' in x:xor_key.append(int(asm.op_str[(asm.op_str.index(',')) + 2:], 16))context(os='linux', arch='amd64', log_level='debug')io = remote('hnctf.imxbt.cn', 33534)io.recvuntil(b'Expected bytes: ')
a = io.recv(48)
io.sendlineafter(b'Bytes? ', a)for i in range(128):io.recvuntil(b'ELF:  ')encrypted_data = io.recvuntil(b'\n').strip()decoded_data = base64.b64decode(encrypted_data)with open("./111", "wb") as file:file.write(decoded_data)ql = Qiling(["./111"], verbose=QL_VERBOSE.OFF)ql.arch.disassembler.detail = Trueql.mem.map(0x10000, 0x10000)ql.hook_code(hook_code, user_data=ql.arch.disassembler)ql.run()ecx_value = ql.arch.regs.rsimemory_address = ql.mem.read(ecx_value - 25, 25)enc = hex(bytes_to_long(bytes([bytes(memory_address[1:25])[j] ^ xor_key[j] for j in range(0x18)])))enc = enc[2:].rjust(48, '0').encode()io.sendlineafter(b'Bytes? ', enc)print(i)xor_key = []io.interactive()
from qiling import *
from qiling.const import QL_VERBOSE
from pwn import *
from Crypto.Util.number import *xor_key = []def hook_code(ql, address, size, user_data):buf = ql.mem.read(address, size)asm = next(user_data.disasm(buf, address))x = f"{asm.mnemonic} {asm.op_str}"if 'xor' in x and 'al' in x:xor_key.append(int(asm.op_str[(asm.op_str.index(',')) + 2:], 16))context(os='linux', arch='amd64', log_level='debug')io = remote('hnctf.imxbt.cn', 33534)io.recvuntil(b'Expected bytes: ')
a = io.recv(48)
io.sendlineafter(b'Bytes? ', a)for i in range(128):io.recvuntil(b'ELF:  ')encrypted_data = io.recvuntil(b'\n').strip()decoded_data = base64.b64decode(encrypted_data)with open("./111", "wb") as file:file.write(decoded_data)ql = Qiling(["./111"], verbose=QL_VERBOSE.OFF)ql.arch.disassembler.detail = Trueql.mem.map(0x10000, 0x10000)ql.hook_code(hook_code, user_data=ql.arch.disassembler)ql.run()ecx_value = ql.arch.regs.rsimemory_address = ql.mem.read(ecx_value - 25, 25)enc = hex(bytes_to_long(bytes([bytes(memory_address[1:25])[j] ^ xor_key[j] for j in range(0x18)])))enc = enc[2:].rjust(48, '0').encode()io.sendlineafter(b'Bytes? ', enc)print(i)xor_key = []io.interactive()

这段代码你要pip install pwntools (qiling)这两个工具

这段代码结合了qiling框架(用于动态二进制分析)、pwntools库(针对渗透测试和逆向工程的瑞士军刀)以及Crypto.Util.number(处理大数运算的模块),目的是解密远程服务器上提供的加密数据并通过一系列交互完成某个挑战或任务。以下是其工作流程的详细解析:

初始化

  • 环境配置:设置上下文环境为Linux amd64架构,并开启详细的日志记录。
  • 远程连接:使用pwntoolsremote函数连接到指定的远程服务器和端口。
  • 接收与发送:首先接收预期的字节长度信息,然后回传接收到的48字节数据作为初始响应。

分析与解密循环

  • 主循环:对于128轮循环,每轮执行以下步骤:
    1. 接收加密数据:接收服务器发来的Base64编码的加密数据。
    2. 保存并加载二进制:将接收到的数据保存到本地文件111,然后使用Qiling框架加载此文件准备动态分析。
    3. 代码钩子设置:定义一个hook_code函数,用于监听执行过程中的每条指令。当遇到包含xor和寄存器al的指令时(这通常涉及到解密操作),提取并记录异或键(xor_key)。
    4. 运行并分析:运行二进制文件,在执行过程中,每当遇到符合条件的xor指令就会触发钩子,逐步构建出完整的解密密钥。
  • 解密过程
    • 读取寄存器ECX的值作为关键地址。
    • 从该地址读取25字节数据,这部分数据预计与之前收集的xor_key有关。
    • 应用异或密钥解密数据:对读取的内存区域中的每个字节与对应位置的xor_key元素进行异或操作。
    • 将解密后的数据转换为大端表示的16进制字符串,并确保填充至48位长度,然后将其发送回服务器作为下一轮的输入。

结束交互

  • 循环结束后,使用io.interactive()进入交互模式,允许手动进一步与远程服务进行通信或查看最终输出。

总之,这段代码通过动态分析技术(利用qiling模拟执行)和简单的加密解密逻辑(基于XOR操作),实现了与远程服务的自动交互,目的是逐步解密并响应服务器发送的加密数据,直至完成所有预设的交互轮次。

 

这里改成对应端口就OK

127个我的仙人

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

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

相关文章

LeetCode算法题:15. 三数之和(Java)

题目描述 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意: 答案中不可以包含重复的三元…

文档分类DPCNN简介(pytorch实现)

文档分类DPCNN简介 DPCNN简介 模型结构区域嵌入等长卷积1/2池化DPCNN模型代码实现 DPCNN简介 论文中提出了一种基于 word-level 级别的网络-DPCNN,由于 TextCNN 不能通过卷积获得文本的长距离依赖关系,而论文中 DPCNN 通过不断加深网络,可以…

RTMP低延迟推流

人总是需要压力才能进步, 最近有个项目, 需要我在RK3568上, 推流到公网, 最大程度的降低延迟. 废话不多说, 先直接看效果: 数据经过WiFi发送到Inenter的SRS服务器, 再通过网页拉流的. 因为是打金任务, 所以逼了自己一把, 把RTMP推流好好捋一遍. 先说说任务目标, 首先是MPP编码…

按照官网引擎问题重新设置监控目录,仍然存在空三等待的问题怎么办?

答:任务目录和引擎目录设置一样,然后取消任务重新写入. 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型&#xff0…

Iphone更换后摄像头蓝光珠

拆蓝光珠 风枪加热240℃,风速70,直接融化掉蓝光珠 清除残胶 风枪加热140℃,风速50 更换新的蓝光珠 点UV胶紫外灯加固,防止晃动 安装完毕!

RT-Thread的 FAL 组件_使用笔记

RT-Thread的FAL分区表组件 1、FAL介绍 FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性: 1.1 FAL目…

【EI稳定检索|主题广泛】2024年航空航天、遥感与计算机国际会议(ARSC 2024)

2024年航空航天、遥感与计算机国际会议(ARSC 2024) 2024 International Conference on Aerospace, Remote Sensing, and Computing 【会议简介】 2024年航空航天、遥感与计算机国际会议将在古都西安召开。本次会议是航空航天、遥感与计算机领域的一次…

[牛客网]——C语言刷题day3

答案&#xff1a;A 解析&#xff1a; A.表示将数组a的首地址赋值给指针变量p B.将一个int型变量直接赋值给一个int型的指针是不行的 C.道理同B D.j2是一个右值&#xff0c;右值是不能进行取地址操作的 #include <iostream> using namespace std;#define N 7 int fun…

Ubuntu16 扩展磁盘空间

一、扩展容量 关闭虚拟机->硬盘->扩展->输入要扩展的空间大小 二、重新磁盘分区 打开虚拟机&#xff0c;在终端安装gparted&#xff1a; sudo apt-get install gparted 打开gparted&#xff1a; sudo gparted 磁盘分区如下图所示 选择/dev/sda5分区&#xff0c;选择…

web3 ETF软件开发难点

开发一个涉及到 Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;的软件可能会面临一些挑战和难点&#xff0c;特别是在整合 Web3 技术和金融服务方面。以下是一些可能的难点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&am…

微信在线预约系统怎么做_让您的业务更高效!

在这个数字化飞速发展的时代&#xff0c;传统的业务预约方式已经逐渐无法满足现代人的需求。随着智能手机的普及和微信用户数量的不断攀升&#xff0c;微信在线预约系统已成为许多企业和个人提升服务效率、优化客户体验的不二之选。今天&#xff0c;就让我们一起探讨微信在线预…

【Linux玩物志】Linux环境开发基本工具使用(1)——vim

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; Linux开发工具 首先我们要知道vim是什么&#xff1f; vi&#xff08;Visual Editor&#xff09;是由美国程序员比尔乌尔曼&#xff08;Bill Joy&#xff09;于1976年开发的&#xff0c;最初是为了在Unix系统上进行文本编…