首页 > 其他分享 >[Moectf2024 Xor(大嘘)]

[Moectf2024 Xor(大嘘)]

时间:2024-11-15 21:20:44浏览次数:1  
标签:Moectf2024 enc 加密 value 大嘘 v1 Xor

[Moectf2024 Xor(大嘘)]

进入主函数

image-20241115211627251

输入32长度的字节

sub_401100(&v7);进行加密

image-20241115211700123

byte_404058是加密后的密文

image-20241115211730835

转dword

sub_401100的加密看似很简单,但其实是错的,动态调试后就会发现到return后会跳到别的函数,追到return处的汇编就会发现有花指令

image-20241115211840388

这里莫名其妙就retn了,nop掉

image-20241115211858559

对loc_401154按u后p重新分析

image-20241115211919073

image-20241115211928688

大概流程就是一个魔改delta的tea加密和一个异或,都是对dword进行操作,猜测a1的低地址处都是储存的各种变量,高地址处储存的是input(我们的输入)

解密后再进行一次异或加密

image-20241115212214652

写出解密脚本:

from struct import *
from ctypes import *
key1 = [
  0x2B, 0xF2, 0x82, 0x41, 0x48, 0x74, 0x9D, 0xAA, 0x7E, 0x4C,
  0xDA, 0x04, 0x08, 0x2C, 0xA8, 0x52, 0x97, 0x77, 0xB7, 0x3B,
  0x16, 0x2D, 0xD4, 0xFC, 0x60, 0xBE, 0xC4, 0xB6, 0x73, 0x19,
  0x94, 0x87]
key = [0x6C6C6568, 0x6F6D5F6F, 0x66746365, 0x34323032]
enc = [0x1F050D3C, 0x301E6E30, 0x52123C04, 0x526D0359, 0x330B0404, 0x3B17331F, 0x72B1A17, 0x5A5B0455]
enc = list(b''.join(pack('<I', i) for i in enc))
for i in range(len(enc)):
    enc[i] ^= key1[i]
enc = [unpack('<I', bytes(enc[i:i + 4]))[0] for i in range(0, len(enc), 4)]
for i in range(0, len(enc), 2):
    v0 = c_uint32(enc[i])
    v1 = c_uint32(enc[i + 1])
    delta = 0x9E3779B9
    sum = c_uint32(delta * 32)
    r = 32
    for j in range(r):
        v1.value -= (sum.value + v0.value) ^ (key[2] + 16 * v0.value) ^ (key[3] + (v0.value >> 5))
        v0.value -= (sum.value + v1.value) ^ (key[0] + 16 * v1.value) ^ (key[1] + (v1.value >> 5))
        sum.value -= delta
    enc[i] = v0.value
    enc[i + 1] = v1.value
enc = list(b''.join(pack('<I', i) for i in enc))
key = list(b''.join(pack('<I', i) for i in key))
for i in range(len(enc)):
    enc[i] ^= key[i % 16]
for i in enc:
    print(chr(i), end='')

标签:Moectf2024,enc,加密,value,大嘘,v1,Xor
From: https://www.cnblogs.com/murasame520/p/18548672

相关文章

  • [Moectf2024 ezMaze]
    去壳分析:迷宫分析10*a2-10:Y(a1-1)/8:X表示按字节处理迷宫迷宫以十六进制压缩,但迷宫是80*56的二进制迷宫dump下来保存,转二进制,用bin(maze[2:]).zfill(8)脚本(bfs):fromcollectionsimportdequemaze=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1......
  • P10856 【MX-X2-T5】「Cfz Round 4」Xor-Forces题解
    题意:给定一个长度为\(n=2^k\)的数组\(a\),下标从\(0\)开始,维护\(m\)次操作:给定\(x\),设数列\(a'\)满足\(a'_i=a_{i\oplusx}\),将\(a\)修改为\(a'\)。其中\(\oplus\)表示按位异或运算。给定\(l,r\),查询\(a\)的下标在\(l,r\)之间的子数组有多少颜色段。不保......
  • xor
    题目链接:xor。下载附件后,使用IDA打开,并反编译,定位到main函数,如下。通过查看main函数源码,可以发现该程序主要的操作如下。for(i=1;i<33;++i)__b[i]^=__b[i-1];if(!strncmp(__b,global,0x21uLL))printf("Success");即,把用户的输入进行......
  • CF1977D XORificator
    CF1977DXORificator题意给你一个二进制(仅由\(0\)和\(1\)组成)\(n\timesm\)矩阵。你可以进行以下操作任意次:反转某一行中的所有值(即用\(1\)替换\(0\),用\(0\)替换\(1\))。矩阵中的某一列如果只包含一个\(1\),则被视为特殊列。你的任务是找出最多有多少列可以同时被特......
  • CF963-Div2-E. Xor-Grid Problem
    CF963-Div2-E.Xor-GridProblem题意给定一个\(n\timesm\)的矩阵\(a\),有两种操作:选择一行,把每个数变成所在列所有数的异或之和。选择一列,把每个数变成所在行所有数的异或之和。求进行任意次操作后整个矩阵最小的美丽值。思路第一个发现:同一数异或两次相当于没有异......
  • [ARC084F] XorShift
    模拟赛题。考虑操作的构成,先忽略\(1\)操作,只考虑任意两个数的异或,不难发现所有能构成的数即为线性基。再考虑\(1\)操作,显然可以对开始的每个数率先进行\(1\)操作再构建线性基。记\(lim=\max(\log_2a,\log_2m)\),发现所有可能有效的数都不超过\(2^{2lim}\)。再考......
  • Xor-FWT 的另一种理解方式
    Xor-FWT的另一种理解方式学习\(\text{Fennec'sAlgorithm}\)的额外收获,顺手记录一下。假设我们要求两个长度为\(n\)的数组的异或卷积,为方便起见令\(n=2^m\),也就是类似下面的形式\[C_k=\sum\limits_{i\oplusj}A_i\timesB_j\]考虑构造\(\mathbb{Z}_2^n\)中的向......
  • [GWCTF 2019]xxor
    [GWCTF2019]xxor首先可以到汇编界面从新定义(U+P)一下main函数,不然看着会有点乱分析追踪input变量可以看到每次循环是获取四字节的输入但后面对于tmp变量的赋值我就有点看不懂了,不要紧,直接动调动态调试连接linux,下断点开调我不知道为什么输入字符会直接跳出循环,所以输入......
  • [MRCTF2020]Xor
    [MRCTF2020]Xor检查无壳,32位分析打开main函数,发现不能F5反汇编如下报错,在分析401095位置处的指令出错.text:00401095callsub_401020此处是一个call指令,我们点进sub_401020函数f5反汇编成功打开然后返回到main函数按F5成功反汇编是个简单的异......
  • E.Tree Xor
    利用线段树划分区间【l,r】点击查看代码#include<bits/stdc++.h>usingnamespacestd;intl[100005],r[100005],w[100005];vector<int>a[100005],c[100005];vector<pair<int,int>>ans;voidask(intl,intr,intu,intv,intid){if(u<=l&&......