首页 > 其他分享 >2023 香山杯 RE部分题解

2023 香山杯 RE部分题解

时间:2023-10-15 19:12:54浏览次数:35  
标签:题解 value RE 2023 input total data uint32 block

 

 URL从哪里来

 main函数断点下载这里

 然后可以看到TempFileName,是out.exe.tmp,还包含路径,直接提取出来用IDA打开,一开始被url误导了,看到了下面的RC4加密去了,使用findcryt软件,看到一个base64加密,

交叉引用 在这

动态调试这个函数 里面的a1,有一串字符是base64密文 ,解密后得到flag

hello_py

算法助手监控,有删除文件的操作,里面应该就保存了py,文件,但直接搜没有搜到,本来想防止他删除导出的,但是在apk里面搜到了一个app.xml,使用压缩软件打开,有个hello.py,就是目标文件。打开后有混淆,使用gpt重命名下

 

from java import jboolean, jclass
import struct
import ctypes


def mix(value1, value2, value3, array, index, value4):
    result1 = (value1.value >> 5 ^ value2.value << 2) + (value2.value >> 3 ^ value1.value << 4)
    result2 = (value3.value ^ value2.value) + (array[(index & 3) ^ value4.value] ^ value1.value)
    return ctypes.c_uint32(result1 ^ result2)


#TEA
def encrypt(num_blocks, input_data, key):
    delta = 0x9e3779b9
    num_rounds = 6 + 52 // num_blocks
    output_data = ctypes.c_uint32(0)
    previous_block = ctypes.c_uint32(input_data[num_blocks - 1])
    sum_value = ctypes.c_uint32(0)

    while num_rounds > 0:
        sum_value.value += delta
        temp_value = (sum_value.value >> 2) & 3

        for i in range(num_blocks - 1):
            next_block = ctypes.c_uint32(input_data[i + 1])
            input_data[i] = ctypes.c_uint32(
                input_data[i] + mix(previous_block, next_block, sum_value, key, i, temp_value).value).value
            previous_block.value = input_data[i]

        next_block = ctypes.c_uint32(input_data[0])
        input_data[num_blocks - 1] = ctypes.c_uint32(
            input_data[num_blocks - 1] + mix(previous_block, next_block, sum_value, key, num_blocks - 1,
                                             temp_value).value).value
        previous_block.value = input_data[num_blocks - 1]

        num_rounds -= 1

    return input_data


def check(input_string):
    print("checking~~~: " + input_string)
    input_string = str(input_string)

    if len(input_string) != 36:
        return jboolean(False)

    block_strings = []
    for i in range(0, 36, 4):
        block = input_string[i:i + 4].encode('latin-1')
        block_strings.append(block)

    input_data = []
    for block in block_strings:
        input_data.append(struct.unpack("<I", block)[0])
    print(input_data)

    encrypted_data = encrypt(9, input_data, [12345678, 12398712, 91283904, 12378192])
    expected_output = [689085350, 626885696, 1894439255, 1204672445, 1869189675, 475967424, 1932042439, 1280104741,
                       2808893494]

    for i in range(9):
        if expected_output[i] != encrypted_data[i]:
            return jboolean(False)
    return jboolean(True)


def say_hello():
    print("hello from py")

 

关键在check里面,调用了一个xxtea加密,编写解密脚本

 

import struct
from ctypes import *


def MX(z, y, total, key, p, e):
    temp1 = (z.value >> 5 ^ y.value << 2) + (y.value >> 3 ^ z.value << 4)
    temp2 = (total.value ^ y.value) + (key[(p & 3) ^ e.value] ^ z.value)

    return c_uint32(temp1 ^ temp2)


def encrypt(n, v, key):
    delta = 0x9e3779b9
    rounds = 6 + 52 // n

    total = c_uint32(0)
    z = c_uint32(v[n - 1])
    e = c_uint32(0)

    while rounds > 0:
        total.value += delta
        e.value = (total.value >> 2) & 3
        for p in range(n - 1):
            y = c_uint32(v[p + 1])
            v[p] = c_uint32(v[p] + MX(z, y, total, key, p, e).value).value
            z.value = v[p]
        y = c_uint32(v[0])
        v[n - 1] = c_uint32(v[n - 1] + MX(z, y, total, key, n - 1, e).value).value
        z.value = v[n - 1]
        rounds -= 1

    return v


def decrypt(n, v, key):
    delta = 0x9e3779b9
    rounds = 6 + 52 // n

    total = c_uint32(rounds * delta)
    y = c_uint32(v[0])
    e = c_uint32(0)

    while rounds > 0:
        e.value = (total.value >> 2) & 3
        for p in range(n - 1, 0, -1):
            z = c_uint32(v[p - 1])
            v[p] = c_uint32((v[p] - MX(z, y, total, key, p, e).value)).value
            y.value = v[p]
        z = c_uint32(v[n - 1])
        v[0] = c_uint32(v[0] - MX(z, y, total, key, 0, e).value).value
        y.value = v[0]
        total.value -= delta
        rounds -= 1

    return v


#  test
if __name__ == "__main__":
# 该算法中每次可加密不只64bit的数据,并且加密的轮数由加密数据长度决定
    v = [689085350, 626885696, 1894439255, 1204672445, 1869189675, 475967424, 1932042439, 1280104741,
                       2808893494]
    k = [12345678, 12398712, 91283904, 12378192]
    n = 9

# print("Data is : ", hex(v[0]), hex(v[1]))
# res = encrypt(n, v, k)
# print("Encrypted data is : ", hex(res[0]), hex(res[1]))
    res = decrypt(n, v, k)
    print("Decrypted data is : ", hex(res[0]), hex(res[1]))
    bytes_object = b''.join(struct.pack('<I', number) for number in res)

# 将字节对象解码为字符串,你可以指定编码(例如'utf-8','latin-1'等)
# 如果转换过程中出现错误,你可以尝试使用不同的编码
    string = bytes_object.decode('latin-1', errors='ignore')

    print(string)
"""
Data is :  0x12345678 0x78563412
Encrypted data is :  0xef86c2bb 0x25f31b5e
Decrypted data is :  0x12345678 0x78563412
"""
#c1f8ace6-4b46-4931-b25b-a1010a89c592

标签:题解,value,RE,2023,input,total,data,uint32,block
From: https://www.cnblogs.com/immune53/p/17765982.html

相关文章

  • 2023-2024-1 20211327 信息安全系统设计与实现 学习笔记5(必做)
    学习笔记5EXT2文件系统概述1级和2级文件系统函数实践过程EXT2文件系统概述EXT2(SecondExtendedFileSystem)是Linux操作系统早期使用的文件系统,它是EXT文件系统家族的第二个版本,于1993年首次引入。在现代Linux系统中已经被后续版本的EXT文件系统(如EXT3和EXT4)所取代。1.......
  • 轻松掌握组件启动之Redis单机、主从、哨兵、集群配置
    单机配置启动Redis安装下载地址:http://redis.io/download安装步骤:1:安装gcc编译器:yuminstallgcc2:将下载好的redis‐5.0.3.tar.gz文件放置在/usr/local文件夹下,并解压redis‐5.0.3.tar.gz文件wgethttp://download.redis.io/releases/redis‐5.0.3.tar.gztarxzfredis......
  • redis在添加键值时报错"(error) MOVED...."
    问题描述:redis在添加键值时报错"(error)MOVED....",如下所示:数据库:redis6.2.5架构:三主三从1、异常重现192.168.133.97:6001>setk1v1(error)MOVED12706192.168.133.99:6001--集群信息192.168.133.97:6001>clusternodesb98cc2012f531244c29e2633f3d40ffc0c8bb2711......
  • Pycharm 2023版安装教程(附激活码,亲测有效)
    PyCharm是一种PythonIDE(集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。第一步:下载Pycharm安......
  • 2023-2024-1 20231305 《计算机基础与程序设计》第三周学习总结
    2023-2024-120231305《计算机基础与程序设计》第三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<自学教材并完......
  • BST-Treap名次树指针实现板子 Ver2.0
    为了更好的阅读体验,请点击这里这里只有板子没有原理QWQ可实现1.插入x数2.删除x数(若有多个相同的数,只删除一个)3.查询x数的排名(排名定义为比当前数小的数的个数+1)4.查询排名为x的数5.求x的前驱(前驱定义为小于x,且最大的数)6.求x的后继(后继定义为大于x,且......
  • 2023-2024-1 20231422徐清恬《计算机基础与程序设计》第三周学习总结
    这个作业属于哪个课程2023-2024-计算机基础与程序设计这个作业要求在哪里2023-2024-计算机基础与程序设计这个作业的目标自学计算机科学概论第2章,第3章,《C语言程序设计》第2章作业正文(https://www.cnblogs.com/Augenstern4545/p/17765954.html)教材学习内容......
  • 2023-2024-1 20231418 《计算机基础与程序设计》第3周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第三周作业这个作业的目标<自学教材:计算机科学概论......
  • 绕过preg_match函数并使用本地命令RCE
    来自[FBCTF2019]RCEService:题目本身不难,但这个知识点值得一提。首先打开是一个输入JSON格式的cmd执行,随便输了输看看回显:我输了个{"cmd":"ls"}嗯?直接出目录了?按道理来说应该有过滤吧。果然输入ls/就:显然把斜杠过滤了,试了试其他的语句,发现cat啥的常规的全给ban了,就只有l......
  • 轻松掌握组件启动之Redis集群扩展秘籍:轻松扩容与缩容,释放高性能潜能
    扩展集群操作扩容在我们原始的集群基础上,我们决定增加一台主节点(8007)和一台从节点(8008),这样新增的节点将会在下图中以虚线框的形式显示在集群中。1:首先,在/usr/local/redis-cluster目录下创建两个文件夹,分别命名为8007和8008。接下来,将8001文件夹下的redis.conf......