HDCTF2023 - Reverse方向全WP

news2025/1/11 5:51:04

文章目录

  • [HDCTF 2023]easy_re
  • [HDCTF 2023]easy_asm
  • [HDCTF 2023]fake_game
  • [HDCTF 2023]enc
  • [HDCTF 2023]double_code
  • [HDCTF 2023]买了些什么呢
  • [HDCTF2023]basketball

[HDCTF 2023]easy_re

在这里插入图片描述

UPX壳,脱壳

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一个base64编码。

在这里插入图片描述


[HDCTF 2023]easy_asm

在这里插入图片描述

在这里插入图片描述

ida打开后可以看到xor 10,al寄存器的内容不知道

在这里插入图片描述

WinHex打开,就能看到异或字符串了。

EXP:

enc = b'XTSDVkZecdOqOu#ciOqC}m'
flag = []
for i in range(len(enc)):
    flag.append(chr(enc[i]^0x10))
print("".join(flag))

# HDCTF{Just_a_e3sy_aSm}

[HDCTF 2023]fake_game

在这里插入图片描述

Pyinstaller编译的,用pyinstxtractor

在这里插入图片描述

将game.pyc反编译成py文件

在这里插入图片描述

在这里插入图片描述

找到对flag进行操作的俩个地方。

先用Z3求出xorr的值,然后再与flag异或得到真正的flag

EXP:

from z3 import *

xorr = [BitVec("num[%d]" % i, 32) for i in range(4)]
s = Solver()
s.add(xorr[0] * 256 - xorr[1] / 2 + xorr[2] * 23 + xorr[3] / 2 == 47118166)
s.add(xorr[0] * 252 - xorr[1] * 366 + xorr[2] * 23 + xorr[3] / 2 - 1987 == 46309775)
s.add(xorr[0] * 6 - xorr[1] * 88 + xorr[2] / 2 + xorr[3] / 2 - 11444 == 1069997)
s.add((xorr[0] - 652) * 2 - xorr[1] * 366 + xorr[2] * 233 + xorr[3] / 2 - 13333 == 13509025)

print(s.check())
for i in xorr:
    print(s.model()[i].as_long(), end=",")

# 178940,248,56890,2361
enc =[0x2bab4,0xbc,0xde79,0x96d,0x2baba,0x83,0xde7d,0x909,0x2bab3,0x9c,0xde65,0x949,0x2ba90,0xca,0xde43,0x90a,0x2ba8e,0xa7,0xde5c,0x909,0x2ba8e,0xa7,0xde6a,0x94f,0x2ba86,0xd9,0xde1b,0x944]
xorr=[178940,248,56890,2361]
flag = []
for i in range(len(enc)):
    flag.append(chr(enc[i] ^ xorr[i%4]))
print(''.join(flag))

# HDCTF{G0Od_pl2y3r_f0r_Pvz!!}

[HDCTF 2023]enc

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

sub_411523用了一个TEA加密

v9 就是 key,v7和v8是密文。

写个脚本逆向一下

#include <stdio.h>
#include <stdint.h>  // 使用uint32_t数据类型需要包含此头文件
#include <string.h>
#include<iostream>
using namespace std;
// 定义加密函数
void tea_decrypt(uint32_t *v, uint32_t *k) {
    uint32_t v0 = v[0], v1 = v[1], sum = 0xC6EF3720, i;  // 根据TEA算法,解密轮次的计算需要初始化sum
    uint32_t delta = 0x9e3779b9;
 
    for (i = 0; i < 32; i++) {
        v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);
        v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);
        sum -= delta;
    }
 
    v[0] = v0;
    v[1] = v1;
}
 
int main() {
    uint32_t enc[2]={0x60FCDEF7,0x236DBEC};
    uint32_t key[]={0x12,0x34,0x56,0x78};
    tea_decrypt(enc,key);
    cout<<enc[0];
    return 0;
}

得到 3

接着往下看,

在这里插入图片描述

在这里插入图片描述

不像是花指令,那应该就是SMC了,本来想用动调的,但这里加了反调试,不知道怎么去除,结合前面得到的key,找修改的地方。

在这里插入图片描述

在这里插入图片描述

最后找到,异或等于a3,可以知道a3 就是前面求出来的 3

写个idapython

for i in range(0x0041D000,0x0041E600):
    patch_byte(i,get_wide_byte(i)^3)
print('done')

之后,选中有用的数据U未定义一下,再P创建函数,F5反编译,得到。

在这里插入图片描述

这里是一个RC4加密

EXP:

def rc4_decrypt(ciphertext, key):
    # 初始化 S-box
    S = list(range(256))
    j = 0
    for i in range(256):
        j = (j + S[i] + key[i % len(key)]) % 256
        S[i], S[j] = S[j], S[i]

    # 初始化变量
    i = j = 0
    plaintext = []

    # 解密过程
    for byte in ciphertext:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        k = S[(S[i] + S[j]) % 256]
        plaintext.append(byte ^ k)

    return bytes(plaintext)


# 示例用法
encrypted_data = [0xF,0x94,0xAE,0xF2,0xC0,0x57,0xC2,0xE0,0x9A,0x45,0x37,0x50,0xF5,0xA0,0x5E,0xCB,0x2C,0x16,0x28,0x29,0xFE,0xFF,0x33,0x46,0xE,0x57,0x82,0x22,0x52,0x26,0x2B,0x6E,0xE4,0x82,0x24]
  # 替换成你的密文
encryption_key = b'you_are_master'  # 替换成你的密钥

decrypted_data = rc4_decrypt(encrypted_data, encryption_key)
print("Decrypted Data:", decrypted_data.decode('utf-8'))

# Decrypted Data: HDCTF{y0u_ar3_rc4_t3a_smc_m4ster!!}


[HDCTF 2023]double_code

在这里插入图片描述

在这里插入图片描述

打开来,慢慢看,start进去,一直进

在这里插入图片描述

找到一个Code

在这里插入图片描述

alloc:%p\n 在这里 接着进去,找到指向这里的指针。

在这里插入图片描述

找到了,根据output写个EXP:

enc = [0x48,0x67,0x45,0x51,0x42,0x7b,0x70,0x6a,0x30,0x68,0x6c,0x60,0x32,0x61,0x61,0x5f,0x42,0x70,0x61,0x5b,0x30,0x53,0x65,0x6c,0x60,0x65,0x7c,0x63,0x69,0x2d,0x5f,0x46,0x35,0x70,0x75,0x7d]
flag = []
for i in range(len(enc)):
    x = i % 5
    match x:
        case 0:
            flag.append(chr(enc[i]))
        case 1:
            flag.append(chr(enc[i]^0x23))
        case 2:
            flag.append(chr(enc[i]-2))
        case 3:
            flag.append(chr(enc[i]+3))
        case 4:
            flag.append(chr(enc[i]+4))
        case 5:
            flag.append(chr(enc[i]+25))
print("".join(flag))

# HDCTF{Sh3llC0de_and_0pcode_al1_e3sy}

[HDCTF 2023]买了些什么呢

在这里插入图片描述

题目运行起来,

在这里插入图片描述

一个01背包问题,动态规划,写个EXP解决。

def knapsack(weights, values, capacity):
    n = len(weights)
    dp = [[0] * (capacity + 1) for _ in range(n + 1)]

    for i in range(1, n + 1):
        for w in range(capacity + 1):
            if weights[i - 1] <= w:
                dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
            else:
                dp[i][w] = dp[i - 1][w]

    selected_items = []
    i, w = n, capacity
    while i > 0 and w > 0:
        if dp[i][w] != dp[i - 1][w]:
            selected_items.append(i-1)
            w -= weights[i - 1]
        i -= 1
    return dp[n][capacity], selected_items


# 商品信息
weights = [2, 5, 10, 9, 3, 6, 2, 2, 6, 8, 2, 3, 3, 2, 9, 8, 2, 10, 8, 6, 4, 3, 4, 2, 4, 8, 3, 8, 4, 10, 7, 1, 9, 1, 5, 7, 1, 1, 7, 4]
values = [8, 1, 5, 9, 5, 6, 8, 2, 3, 7, 5, 4, 3, 7, 6, 7, 9, 3, 10, 5, 2, 4, 5, 2, 9, 5, 8, 10, 2, 9, 6, 3, 7, 3, 9,  6, 10, 1, 2, 9]

# 背包容量
capacity = 50

max_value, selected_items = knapsack(weights, values, capacity)

print("最大价值:", max_value)
print("选择的商品编号:", selected_items)
selected_items = selected_items[::-1]
for i in range(len(selected_items)):
    print(selected_items[i],end=' ')
    
# 最大价值: 116
# 选择的商品编号: [39, 36, 34, 33, 31, 26, 24, 22, 21, 18, 16, 13, 11, 10, 6, 4, 0]
# 0 4 6 10 11 13 16 18 21 22 24 26 31 33 34 36 39 

[HDCTF2023]basketball

在这里插入图片描述

在这里插入图片描述

俩处加密,第一处对一句话进行一个f(x,y)的加密,这里加密用到了俩个伪随机数。加密后的密文是Str2

在这里插入图片描述

写一个爆破脚本枚举一下

def f(k1_0, k2_0):
    for i in range(len(str)):
        k1_0 = (str[i] + k1_0) % 300
        k2_0 = (str[i] + k2_0) % 300
        str[i] ^= text_66(k1_0, k2_0)


def text_66(a, b):
    aa = a
    ba = b
    if a < b:
        aa, ba = ba, aa
    if ba:
        return text_66(ba, aa % ba)
    else:
        return aa


for x in range(100):
    for y in range(100):
        str = [0x55, 0x69, 0x68, 0x78, 0x21, 0x68, 0x72, 0x21, 0x60, 0x21,
               0x69, 0x62, 0x65, 0x75, 0x21, 0x7C, 0x69, 0x6A, 0x75, 0x21,
               0x48, 0x21, 0x69, 0x64, 0x6D, 0x71, 0x2B, 0x78, 0x6E, 0x74,
               0x21, 0x68, 0x72, 0x2B, 0x73, 0x64, 0x6C, 0x68, 0x6F, 0x65,
               0x21, 0x78, 0x6E, 0x74, 0x21, 0x75, 0x6E, 0x21, 0x62, 0x49,
               0x64, 0x62, 0x6A, 0x21, 0x75, 0x69, 0x64, 0x21, 0x60, 0x73,
               0x73, 0x60, 0x78, 0x21, 0x60, 0x6F, 0x65, 0x21, 0x75, 0x69,
               0x73, 0x64, 0x64, 0x21, 0x6F, 0x74, 0x66, 0x63, 0x64, 0x73,
               0x72, 0x21, 0x62, 0x60, 0x6F, 0x21, 0x77, 0x62, 0x64, 0x76,
               0x21, 0x60, 0x72, 0x21, 0x60, 0x21, 0x66, 0x73, 0x6E, 0x74,
               0x71, 0x00]
        f(x, y)
        for i in str:
            if i < 33 or i > 127:
                break
            else:
                print(''.join(chr(j) for j in str))

得到的结果不是很准确,

在这里插入图片描述

只能大概看出,this is a hint i help you is remind you to check the array and three numbers can view as a group

翻译后大概就是,数组三个为一组?附件有一个array.txt。

附件内

在这里插入图片描述

全是300以内的数字,结合 三个为一组,联想到RGB。可以利用python的PTL库来构造一张彩色图像。

from PIL import Image

# 从文件中读取数据
with open('C:\\Users\\Sciurdae\\Downloads\\basketball\\array.txt', 'r') as f:
    data = f.read().split()  # 假设数据是空格分隔的

# 指定图像的宽度和高度
width = 637
height = 561

# 创建图像对象
image = Image.new("RGB", (width, height))

# 遍历数据并设置像素值
index = 0
for y in range(height):
    for x in range(width):
        r, g, b = int(data[index]), int(data[index + 1]), int(data[index + 2])
        image.putpixel((x, y), (r, g, b))
        index += 3

# 保存图像
image.save('output_image.png')

# 展示图像
image.show()

这一题看了官方的wp,根据hint?

在这里插入图片描述

没有在程序中找到o(╥﹏╥)o。只能暂时放一边了。

在这里插入图片描述

得到一张写着,我想打篮球的图片。翻译成英语,“I want to play basketball”

再结合flag 为 28 位,可以得到,“I want to play basketballI w”

之后再与code异或就好了。

code = [1,100,52,53,40,15,4,69,46,109,47,40,55,55,92,94,62,70,23,72,8,82,29,65,16,117,117,10]
str = 'I want to play basketballI w'
flag = ''
for i in range(28):
    flag += chr(ord(str[i]) ^ code[i])
print(flag)
#HDCTF{$1AM_DVN|<_5|-|0|-|<U}

.(img-x58Np97x-1700493600487)]

得到一张写着,我想打篮球的图片。翻译成英语,“I want to play basketball”

再结合flag 为 28 位,可以得到,“I want to play basketballI w”

之后再与code异或就好了。

code = [1,100,52,53,40,15,4,69,46,109,47,40,55,55,92,94,62,70,23,72,8,82,29,65,16,117,117,10]
str = 'I want to play basketballI w'
flag = ''
for i in range(28):
    flag += chr(ord(str[i]) ^ code[i])
print(flag)
#HDCTF{$1AM_DVN|<_5|-|0|-|<U}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入了解千兆光模块和万兆光模块

光模块是一种光电转换设备&#xff0c;在发射端&#xff0c;光模块能够将设备产生的电信号转换成光信号从而实现在光纤介质中传输&#xff0c;在接收端光模块将接收到的光信号再次转换为设备能够识别的电信号&#xff0c;从而实现高速、精准的数据传输。例如&#xff0c;在线视…

V100 GPU服务器安装CUDA教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

常见树种(贵州省):009楠木、樟木、桂木种类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、楠木 …

python实现炫酷的屏幕保护程序

shigen日更文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 上次的文章如何实现一个下班倒计时程序的阅读量很高&#xff0c;觉得也很实用酷炫&#xff0c;下边是昨天的体验…

Leetcode刷题详解——删除并获得点数

1. 题目链接&#xff1a;740. 删除并获得点数 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;你可以对它进行一些操作。 每次操作中&#xff0c;选择任意一个 nums[i] &#xff0c;删除它并获得 nums[i] 的点数。之后&#xff0c;你必须删除 所有 等于 nums[i] …

如何使用http来获取thingsbord中的设备数据

背景 有个读者问我,他想做tb的二次开发,想要通过一个接口来查询设备的遥测数据。 于是我给他写了这篇文章。 具体实现 由于他使用的是cloud版本,于是我使用cloud来做演示 文档的接口 https://thingsboard.cloud/swagger-ui/#/telemetry-controller/getTimeseriesUsing…

一道简单的积分题目

题目如下图&#xff1a; 解法1&#xff1a; 解法2&#xff1a; 解法3&#xff1a; 错误做法&#xff1a; 在 x ∈ ( 0 , ∞ ) 上有 ln ⁡ x < x &#xff0c;令 f ( x ) ln ⁡ x 1 x 2 &#xff0c; g ( x ) &#xff1d; x 1 x 2 ∴ f ( x ) < g ( x ) &#x…

【汇编】“转移”综述、操作符offset、jmp指令

文章目录 前言一、转移综述1.1 :背景&#xff1a;1.2 转移指令1.3 转移指令的分类按转移行为根据指令对IP修改的范围不同 二、操作符offset2.1 offset操作符是干什么的&#xff1f;标号是什么&#xff1f; 2.2 nop是什么&#xff1f; 三、jmp指令3.1 jmp指令的功能3.2 jmp指令&…

Vue移动 HTML 元素到指定位置 teleport 标签

teleport 标签&#xff1a;用于将组件中的 HTML 元素移动到任意的位置。 使用 teleport 标签移动 HTML 元素&#xff1a; <!-- 将 teleport 中的内容移动到 body 标签中 --> <teleport to"body"><div><h3>我是第三层组件的标题</h3>…

腾讯云轻量数据库1核1G性能测评、租用费用和详细介绍

腾讯云轻量数据库服务采用腾讯云自研的新一代云原生数据库 TDSQL-C&#xff0c;融合了传统数据库、云计算与新硬件技术的优势&#xff0c;100%兼容 MySQL&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB 海量分布式智能存储&#xff0c;保障数据安全可靠。腾讯云百科t…

Android Termux安装MySQL,内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

【Linux】:进程间通信和日志模拟

进程间通信 一.基本概念二.简单的通信-管道(匿名管道)1.建立通信信道2.通信接口 三.命名管道三.模拟命名管道通信&#xff08;加上日志&#xff09;1.完整代码2.基本使用 一.基本概念 是什么 两个或多个进程实现数据层面的交互。 因为进程独立性的存在&#xff0c;导致进程间…

【前段基础入门之】=>CSS3新特性 BFC

什么是BFC( 概念) W3C 上对 BFC 的定义&#xff1a; MDN 上对 BFC 的定义&#xff1a; 简而言之 开启了BFC能解决什么问题 元素开启 BFC 后&#xff0c;其子元素不会再产生 margin 塌陷问题元素开启 BFC 后&#xff0c;自己不会被其他浮动元素所覆盖元素开启 BFC 后&#xff0…

【Java】多线程-wait/notify

1、wait和notify Java的多线程中&#xff0c;线程的执行顺序和时间都是不定的。为了控制线程的调度顺序&#xff0c;前面我们引入了join()方法。 但是join()只能在线程执行完后&#xff0c;才能执行其他线程&#xff0c;有没有什么方法可以在线程执行顺序中来调度其他线程呢&…

代码随想录 Day50 单调栈 LeetCodeT503 下一个最大元素II T42接雨水

前言 前面我们说到了单调栈的第一题,下一个最大元素I,其实今天的两道题都是对他的变种,知道第一个单调栈的思想能够想清楚,其实这道题是很简单的 考虑好三个状态,大于等于小于,其实对于前面这些题目只要细心的小伙伴就会发现其实小于和等于的处理是一样的都是直接入栈,只有大于…

灵魂拷问std::enable_shared_from_this,揭秘实现原理

灵魂拷问std::enable_shared_from_this&#xff0c;揭秘实现原理 引言 在C编程中&#xff0c;使用智能指针是一种安全管理对象生命周期的方式。std::shared_ptr是一种允许多个指针共享对象所有权的智能指针。然而&#xff0c;当一个对象需要获取对自身的shared_ptr时&#xff0…

中贝转债上市价格预测

中贝转债-113678 基本信息 转债名称&#xff1a;中贝转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;5.17亿元。 正股名称&#xff1a;中贝通信&#xff0c;今日收盘价&#xff1a;49.2元&#xff0c;转股价格&#xff1a;32.8元。 当前转股价值 转债面值…

JavaScript中的random小案例

前言 Math对象是JavaScript的内置对象&#xff0c;而random是Math对象属性 Math.random&#xff08;&#xff09;函数返回一个浮点数&#xff0c;伪随机数在范围从0 到小于1&#xff0c;也就是说&#xff0c;从 0&#xff08;包括 0&#xff09;往上&#xff0c;但是不包括 1&a…

Python编程技巧 – 使用字典

Python编程技巧 – 使用字典 Python Programming Skills – Using Dictionary Dictionary, 即字典&#xff0c;这是Python语言的一种重要的数据结构&#xff1b;Python字典是以键&#xff08;key&#xff09;值(value)对为元素&#xff0c;来存储数据的集合。 前文提到Python列…

春秋云境靶场CVE-2022-30887漏洞复现(任意文件上传漏洞)

文章目录 前言一、CVE-2022-30887描述和介绍二、CVE-2021-41402漏洞复现1、信息收集2、找可能可以进行任意php代码执行的地方3、漏洞利用找flag 总结 前言 此文章只用于学习和反思巩固渗透测试知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随…