LitCTF2023 - Reverse方向 全WP

文章目录

  • [[LitCTF 2023]世界上最棒的程序员](#[LitCTF 2023]世界上最棒的程序员)
  • [[LitCTF 2023]ez_XOR](#[LitCTF 2023]ez_XOR)
  • [[LitCTF 2023]enbase64](#[LitCTF 2023]enbase64)
  • [[LitCTF 2023]snake](#[LitCTF 2023]snake)
  • [[LitCTF 2023]程序和人有一个能跑就行了](#[LitCTF 2023]程序和人有一个能跑就行了)
  • [[LitCTF 2023]debase64](#[LitCTF 2023]debase64)
  • [[LitCTF 2023]For Aiur](#[LitCTF 2023]For Aiur)
  • LitCTF{Pylon_OverCharge!!_We_Must_construc7_addition4l_pylons}

[LitCTF 2023]世界上最棒的程序员

入门题


[LitCTF 2023]ez_XOR

注意Str2 还有个XOR函数,点进去

3 作为参数 传给XOR,乘以3 所以是异或9 而不是异或3

EXP:

python 复制代码
enc = b'E`}J]OrQF[V8zV:hzpV}fVF[t'
flag = []
for x in enc:
    flag.append(chr(x^9))
print("".join(flag))

# LitCTF{XOR_1s_3asy_to_OR}

[LitCTF 2023]enbase64

好像对base64码表做了处理,但是不管,先尝试解码再说

解不了,嗯再回去看。

有个basechange

下个断点,用动态调试,Local Windows debugger

选中后Shift+E 复制下来就好,

python 复制代码
import base64

str = 'GQTZlSqQXZ/ghxxwhju3hbuZ4wufWjujWrhYe7Rce7ju'

string1 = "gJ1BRjQie/FIWhEslq7GxbnL26M4+HXUtcpmVTKaydOP38of5v90ZSwrkYzCAuND"  # 替换的表

string2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

print(base64.b64decode(str.translate(str.maketrans(string1, string2))))

# LitCTF{B@5E64_l5_tooo0_E3sy!!!!!}

[LitCTF 2023]snake

pyc文件,反编译一下就好,可以使用在线网站,pyc反编译

也可以使用uncompyle6,安装就是pip install uncompyle6 ,对py版本有要求,自行查询。

命令如上。

反编译后发现出错,unknown magic number,说明pyc的文件头出错了。

用winhex看一看

对比一下正常的magic number

实际上,pyc文件的magic number是根据编译的python版本而变化的,

文末附上 magic number 的对照表。

这一题题目是37,应该是py3.7编译的,所以我们根据3.7的magic number修改

再次反编译,

找到flag部分

EXP:

python 复制代码
flag = [
        30, 196,
        52, 252, 49, 220, 7, 243,
        3, 241, 24, 224, 40, 230,
        25, 251, 28, 233, 40, 237,
        4, 225, 4, 215, 40, 231,
        22, 237, 14, 251, 10, 169]
for i in range(0, len(flag), 2):
    flag[i], flag[i + 1] = flag[i + 1] ^ 136, flag[i] ^ 119
for i in range(len(flag)):
    flag[i] = chr(flag[i])
print("".join(flag))

# LitCTF{python_snake_is_so_easy!}

[LitCTF 2023]程序和人有一个能跑就行了

打开来,一个litctf,一串数据,一个memcmp比较。

sub_4015A0估计是个加密函数,点进去看看

是个RC4加密,不了解RC4的去学习。

提取出密文,解密

EXP:

python 复制代码
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 = [
    0x8D, 0x6C, 0x85, 0x76, 0x32, 0x72, 0xB7, 0x40, 0x88, 0x7E, 0x95, 0xEE, 0xC5, 0xED, 0x2E, 0x71, 0x37, 0xF1, 0x4A,
    0x99, 0x35, 0x18, 0xA7, 0xB0, 0, 0x96, 0xB7]  # 替换成你的密文
encryption_key = b'litctf'  # 替换成你的密钥

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

# Decrypted Data: LitCTF{this_is_a_fake_flag}

[LitCTF 2023]debase64

我这里为了方便修改了v5,用快捷键Y。

可以看到sub_401520 对 v7进行了处理,大概是放到v4里面,点进去

一个base64编码。因为base64编码每三个字节为一组,所以这里只取到0x70,共12个字节。

如果是没有改变数组大小的话,

需要先转换成十六进制,又因为数据在内存中是小端序存储,所以需要将十六进制前后颠倒一下,

python 复制代码
import base64
str_encoded = [0x46, 0xed, 0x18, 0x96, 0x56, 0x9E, 0xd2, 0x72, 0xb2, 0xb3, 0x80, 0x70]
bytes_encoded = bytes(str_encoded)
decoded_bytes = base64.b64encode(bytes_encoded).decode('utf-8')
print(decoded_bytes)

数据取出来解一下base64.得到Ru0Yllae0nKys4Bw

  • 这里其实有点卡壳,也给我打开了点思路,一直逆向都卡死了,按照原本的思路将我们输入的明文经过base64编码得到密文,那么逆向就是用密文base64解码得到明文flag。但是这里是用 "密文" 来进行编码。导致我一直卡着。斯

Ru0Yllae0nKys4Bw有点怪,每四个字节逆序一下,

python 复制代码
enc = b'Ru0Yllae0nKys4Bw'
# 将字节对象按四个字节一组进行切片,然后逆序
enc_reversed = b''.join(enc[i:i+4][::-1] for i in range(0, len(enc), 4))
print(enc_reversed)

得到 Y0uReallyKn0wB4s

再根据题目描述,后面有三个等号,那么 len(flag)+3 = 19。flag长度为20,故根据md5爆破

python 复制代码
import hashlib
import string
en_flag = 'Y0uReallyKn0wB4s'
for i in string.printable:
    end = en_flag + i + '==='
    if hashlib.md5(end.encode()).hexdigest() == '5a3ebb487ad0046e52db00570339aace':
        print(end)
        exit()

# Y0uReallyKn0wB4s3===
  • 做完了。其实做的过程中,我有使用 12345678900987654321的输入验证,发现经过base64编码后的数据和自己编码后的截然不同,说明题目的base64编码是经过魔改的,但为何 可以通过 密文 用普通的base64编码得到部分的明文数据?感觉有点费解,还是我钻了牛角尖,不过也算是为我打开了点思路,有时候,不要想太多,不要想太死,思维打开点。呼-->

[LitCTF 2023]For Aiur

pyinstaller编译的,可以使用pyinstxtractor反编译出文件

具体使用自行查阅。

找到主要的pyc文件,先拖入winhex中和struct对比一下,看一看magic number有没有缺失。

这一题中是完好的。

在线网站反编译一下。

下面都是对于游戏操作的一些设定,看from处有个check,可以,接下来去找ch

找到后反编译ch.pyc

解一下就可以了。

EXP:

python 复制代码
enc = [
98, 77, 94, 91, 92, 107, 125, 66, 87, 70, 113, 92, 83, 70, 85, 81, 19, 21, 109, 99, 87, 107, 127, 65, 65, 64, 109,
87, 93, 90, 65, 64, 64, 65, 81, 3, 109, 85, 86, 80, 91, 64, 91, 91, 92, 0, 94, 107, 66, 77, 94, 91, 92, 71]
lis = []
num = 0

while True:
    flag = 'LitCTF{'
    if num % 2 == 0 and num % 4 == 0 and num % 6 == 0 and num % 8 == 0 and num % 12 == 0 and num % 13 == 11:
        k = str(num)
        for i in range(len(enc)):
            flag += chr(ord(k[(i % len(k))]) ^ enc[i])
            lis.append(ord(k[(i % len(k))]) ^ enc[i])
        flag += '}'
        print(flag)
        break
    num += 1

# LitCTF{Pylon_OverCharge!!_We_Must_construc7_addition4l_pylons}
复制代码
k = str(num)
    for i in range(len(enc)):
        flag += chr(ord(k[(i % len(k))]) ^ enc[i])
        lis.append(ord(k[(i % len(k))]) ^ enc[i])
    flag += '}'
    print(flag)
    break
num += 1

LitCTF{Pylon_OverCharge!!_We_Must_construc7_addition4l_pylons}

复制代码
``enum PycMagic {    MAGIC_1_0 = 0x00999902,    MAGIC_1_1 = 0x00999903, /* Also covers 1.2 */    MAGIC_1_3 = 0x0A0D2E89,    MAGIC_1_4 = 0x0A0D1704,    MAGIC_1_5 = 0x0A0D4E99,    MAGIC_1_6 = 0x0A0DC4FC,     MAGIC_2_0 = 0x0A0DC687,    MAGIC_2_1 = 0x0A0DEB2A,    MAGIC_2_2 = 0x0A0DED2D,    MAGIC_2_3 = 0x0A0DF23B,    MAGIC_2_4 = 0x0A0DF26D,    MAGIC_2_5 = 0x0A0DF2B3,    MAGIC_2_6 = 0x0A0DF2D1,    MAGIC_2_7 = 0x0A0DF303,     MAGIC_3_0 = 0x0A0D0C3A,    MAGIC_3_1 = 0x0A0D0C4E,    MAGIC_3_2 = 0x0A0D0C6C,    MAGIC_3_3 = 0x0A0D0C9E,    MAGIC_3_4 = 0x0A0D0CEE,    MAGIC_3_5 = 0x0A0D0D16,    MAGIC_3_5_3 = 0x0A0D0D17,    MAGIC_3_6 = 0x0A0D0D33,    MAGIC_3_7 = 0x0A0D0D42,    MAGIC_3_8 = 0x0A0D0D55,    MAGIC_3_9 = 0x0A0D0D61, };``
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习