HNCTF——maybe_xor

2024-05-16 14:12
文章标签 hnctf xor maybe

本文主要是介绍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个我的仙人

这篇关于HNCTF——maybe_xor的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995139

相关文章

ABC367G-Sum of (XOR^K or 0)

第一次学会多项式的题目。 题意: n n n个数的多重集 S S S,设 S ′ ⊆ S , f ( A ) = [ ∣ A ∣ = t m , t ∈ Z ] ( X O R a i ∈ a a i ) k S' \subseteq S,f(A)=[|A| =tm,t\in Z](XOR_{a_i\in a}ai)^k S′⊆S,f(A)=[∣A∣=tm,t∈Z](XORai​∈a​ai)k

E - Xor Distances

树和 xor 有些地方 很契合🔥。。 比如树上距离。。很容易想到减去lca公共的那段。 而xor 他异或 刚好也是会抵消公共部分的。。。 题目链接 #include <bits/stdc++.h>using namespace std;#define int long long#define ll __int128_t#define ar array<int, 2>#define a

buuctf [MRCTF2020]Xor

前言:学习笔记。 32位IDA 打开。 先查找字符串 ok,反汇编不了,好吧,只能看汇编代码。 那咱用OD去做。顺便复习汇编语言 接着往下。 没看懂?那把JNZ SHORT xor.00CE10FF 给NOP掉再看看。 再走一遍。 猜测AL是否代表的是下标? CL是对应值?不确定,再走一遍。 OK,结案,程序是对应值与对应下

[POJ 3764] The xor-longest Path (Tire树 + 贪心)

POJ - 3674 题意是给你一个树,每条边有一个权值,求得树上一条路径,使路径上每条边权值的异或和最大 首先用一个 DFS把根到任意点的路径的异或和求出来 xorv[i] 由异或的性质可得点 u和点 v的异或和即为 xorv[u]^xorv[v] ( 根到两点 LCA的异或和会消去) 然后问题就转化成在区间内找两个值,使得他们的异或和最大 与 LightOJ - 1269一样的做法,

To xor or not to xor 高斯消元求异或

【题目】 给你n个long long范围内的整数,你可以选取1个或多个数进行异或操作,使得结果最大,求最大的结果。 【题目分析】 真是一道好题,不是真正理解高斯消元是无法做这题的。 题意:给你n个数,可以选择任意个数异或,但是要使得最后的异或值最大。 我们把每个数用二进制表示,要使得最后的异或值最大,就是要让高位尽量为1,高位能不能为1就必须用高斯消元判断了。 1. 根据数的二进制表示,建立

C# OpenCvSharp 逻辑运算-bitwise_and、bitwise_or、bitwise_not、bitwise_xor

bitwise_and 函数 🤝 作用或原理: 将两幅图像进行与运算,通过逻辑与运算可以单独提取图像中的某些感兴趣区域。如果有掩码参数,则只计算掩码覆盖的图像区域。 示例: 在实际应用中,可以用 bitwise_and 来提取图像中的某些部分。例如,我们可以从图像中提取出一个特定的颜色范围(如红色)。 using OpenCvSharp;class Program{static void

Intel8086处理器使用NASM汇编语言实现操作系统07-以除法和BCD码两种方式显示10进制和16进制数字到屏幕/div/xor

div除法指令,这是我最烦的汇编指令之一了,它的写法在不同位数CPU上都是不一样的 div bh ;表示用AX里的值除以bh寄存器中的值;因为div后面接8位寄存器或者内存地址,商在AL寄存器中,余数在AH寄存器中div bx ;表示用高16位在DX,低16位在AX里的值,除以bx寄存器中的值;因为div后面接16位寄存器或者内存地址,商在AX寄存器中,余数在DX寄存器中div ebx

Golang-编码加密-Xor(GG)

go语言环境搭建 Golang学习日志 ━━ 下载及安装_golang下载-CSDN博客    go run xxx.go   go build xxx.go  首先,cs.msf生成比特流数据.  放入xor,py脚本中进行xor加密.  xor.py def xor(shellcode, key):new_shellcode = ""key_len

[HNCTF 2022 WEEK4]flower plus

第一种花指令 第二种花指令 根据两种花指令特征,写出去花指令脚本 saddr=0x401000eaddr=0x435000for i in range(saddr,eaddr):if get_wide_dword(i)==0x01740275:print(hex(i)+','+hex(get_wide_dword(i)))patch_byte(i-5,0x90)patch_dword

hdu 5269 ZYB loves Xor I

题目: ZYB喜欢研究Xor,现在他得到了一个长度为n的数组A。于是他想知道:对于所有数对(i,j)(i∈[1,n],j∈[1,n]),lowbit(AixorAj)之和为多少.由于答案可能过大,你需要输出答案对998244353取模后的值定义lowbit(x)=2k,其中k是最小的满足(x and 2k)>0的数特别地:lowbit(0)=0 输入: 一共T(T≤10)组数