• FSCTF2023-Reverse方向题解WP。学习贴


    [FSCTF 2023]signin

    在这里插入图片描述

    UPX壳,用upx -d 文件名脱壳

    在这里插入图片描述

    在这里插入图片描述

    简单的替换,得到flag。


    [FSCTF 2023]MINE SWEEPER

    在这里插入图片描述

    在这里插入图片描述

    IDA打开得到flag。


    [FSCTF 2023]Xor

    在这里插入图片描述

    在这里插入图片描述

    与0x12依次异或,

    EXP:

    enc = b't~suiFz{aM{aMsMwsakM`wdw`awo'
    flag = []
    for i in range(len(enc)):
        flag.append(chr(enc[i]^0x12))
    print(''.join(flag))
    
    # flag{This_is_a_easy_reverse}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    [FSCTF 2023]EZRC4

    在这里插入图片描述

    在这里插入图片描述

    ezrc4,key和密文已给出,看rc4_crypt

    在这里插入图片描述

    没要魔改,init里面是俩个S盒,直接用脚本解密。

    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 = [0xEB,0xD,0x61,0x29,0xBF,0x9B,5,0x22,0xF3,0x32,0x28,0x97,0xE3,0x86,0x4D,0x2D,0x5A,0x2A,0xA3,0x55,0xAA,0xD5,0xB4,0x6C,0x8B,0x51,0xB1]  # 替换成你的密文
    encryption_key = b'wanyuanshenwande'  # 替换成你的密钥
    
    decrypted_data = rc4_decrypt(encrypted_data, encryption_key)
    print("Decrypted Data:", decrypted_data.decode('utf-8'))
    
    # Decrypted Data: flag{I_L0VE_gensh1n_Imp4ct}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    [FSCTF 2023]ez_pycxor

    pyc文件,找个在线网站反编译一下,

    源代码:

    #!/usr/bin/env python
    # visit https://tool.lu/pyc/ for more information
    # Version: Python 3.10
    
    flag = input('plz input your flag:')
    encoded_flag = []
    key = 'FUTURESTARS'
    ciphertxt = [
        168,
        169,
        185,
        170,
        160,
        157,
        197,
        132,
        226,
        134,
        134,
        145,
        255,
        242,
        130,
        139,
        234,
        140,
        180,
        229,
        179,
        246,
        243,
        181,
        183,
        182,
        249,
        163,
        254,
        189,
        246,
        166]
    for i in range(len(flag)):
        encoded_flag.append((ord(flag[i]) ^ 168) + i)
    for i in range(len(encoded_flag)):
        if i % 2 == 0:
            encoded_flag[i] ^= ord(key[i % 11])
        if i % 2 == 1:
            encoded_flag[i] ^= ord(key[i % 11])
    if encoded_flag == ciphertxt:
        print('OK! You have crack it!')
        return None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    简单的加密,逆向一下,就是根据索引奇偶执行异或先执行和key的循环异或,再减去i异或168、

    EXP:

    key = 'FUTURESTARS'
    ciphertxt = [168, 169, 185, 170, 160, 157, 197, 132, 226, 134, 134, 145, 255, 242, 130, 139, 234, 140, 180, 229, 179,
                 246, 243, 181, 183, 182, 249, 163, 254, 189, 246, 166]
    flag = []
    for i in range(len(ciphertxt)):
        flag.append(ciphertxt[i] ^ ord(key[i % 11]))
    for i in range(len(ciphertxt)):
        flag[i] = chr((flag[i] - i) ^ 168)
    print("".join(flag))
    
    # FSCTF{8a3ccd61ab7ff9e87acb9c9d1}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [FSCTF 2023]Tea_apk

    apk文件,用jadx打开,

    在这里插入图片描述

    看MainActivity,

    在这里插入图片描述

    在这里插入图片描述

    上面是XXTEA的加密过程,这里直接用在线网站解密就好。

    在这里插入图片描述


    [FSCTF 2023]ezcode

    在这里插入图片描述

    一个py bytecode的题目,之前写过一篇bytecode反编译的博客。不太会的可以去看看。

    在这里插入图片描述

    这里就是四个函数,func1 func2 func3 还有 encode,

    在这里插入图片描述

    这里就是main函数,可以看到一个k,input是 m 对输入和k进行一个func1的操作,然后对得到的密文c做一个encode的操作,之后进行比较。

    在这里插入图片描述

    func1 函数,题做多点就敏感了,这里就是rc4了。func2创造S盒,func3 加密处理。

    在这里插入图片描述

    值得注意的是func3,RC4的加密过程魔改了一部分,

    在这里插入图片描述

    多了一个key,

    在这里插入图片描述

    encode部分就是一个改了码表的base64编码

    在这里插入图片描述

    所以逆向一下,先对密文进行base64解码,然后RC4解密,

    在这里插入图片描述

    记得转换为整数。

    string = "=.#MØQïò\ntÂЭv|·"
    numeric_list = [ord(char) for char in string]
    print(numeric_list)
    
    # [61, 46, 35, 77, 216, 81, 239, 157, 242, 10, 116, 194, 208, 173, 118, 124, 183]
    
    • 1
    • 2
    • 3
    • 4
    • 5

    最后进行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 = []
        y = 'FSCTF'
        # 解密过程
        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 ^ ord(y[i % 5]))
    
        return bytes(plaintext)
    
    
    # 示例用法
    encrypted_data = [61, 46, 7, 35, 77, 216, 81, 239, 157, 242, 12, 116, 194, 208, 173, 118, 124, 183]  # 替换成你的密文
    encryption_key = b'XFFTnT'  # 替换成你的密钥
    
    decrypted_data = rc4_decrypt(encrypted_data, encryption_key)
    print("Decrypted Data:", decrypted_data.decode('utf-8'))
    
    # Decrypted Data: FSCTF{G00d_j0b!!!}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    [FSCTF 2023]ezbroke

    在这里插入图片描述

    用WinHex查看一下。

    在这里插入图片描述

    PE文件头和偏移都错了。修改完保存再次用expinfope查看,发现UPX壳,但是脱壳失败了。

    原来UPX标识也被魔改了。

    在这里插入图片描述

    这之后就可以了。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    一个VM虚拟机的题目,

    在这里插入图片描述

    code里面是操作码opcode,下面是三个指令操作,这里都给出了名字,不用自己辨别了。

    在这里插入图片描述

    可以看到其实只有一个0x17的操作。

    在这里插入图片描述

    还有一个check,enc_flag里面是密文。

    在这里插入图片描述

    大致模拟一下出来的指令,可以知道是逐个字节异或。

    直接写EXP:

    enc = [0x51, 0x44, 0x54, 0x43, 0x51, 0x6C, 0x4E, 0x27, 0x62, 0x37,
      0x64, 0x62, 0x74, 0x74, 0x72, 0x64, 0x64, 0x71, 0x62, 0x26,
      0x26, 0x6E, 0x37, 0x75, 0x65, 0x27, 0x7C, 0x24, 0x37, 0x7A,
      0x6E, 0x37, 0x67, 0x65, 0x27, 0x63, 0x24, 0x74, 0x63, 0x26,
      0x27, 0x79, 0x36, 0x36, 0x36, 0x6A, 0x00]
    flag = []
    for i in range(len(enc)):
        flag.append(chr(enc[i] ^ 0x17))
    print("".join(flag))
    
    # FSCTF{Y0u successfu11y br0k3 my pr0t3ct10n!!!}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    [FSCTF 2023]rrrrust!!!

    在这里插入图片描述

    在这里插入图片描述

    明显的密文,

    在这里插入图片描述

    往下看可以看到比较的地方,

    在这里插入图片描述

    al寄存器里面存放的就是 经过加密后的数据,

    这里直接用动态调试,输入32个1,观察每次加密后的结果。

    动态调试的方法就是将jnz修改成jz,这样才可以看到每次加密的数据。

    可以发现是循环异或,和XFFTnT,写个EXP

    enc = [0x3E, 0x2A, 0x27, 0x33, 0x15, 0x03, 0x3D, 0x77, 0x25, 0x64,
      0x03, 0x67, 0x07, 0x32, 0x76, 0x0B, 0x1C, 0x21, 0x2B, 0x32,
      0x19, 0x23, 0x5E, 0x26, 0x69, 0x22, 0x3B]
    key = 'XFFTnT'
    flag = []
    for i in range(len(enc)):
        flag.append(chr(enc[i] ^ ord(key[i%6])))
    print(''.join(flag))
    
    # flag{We1c0m3_t0_rust_w0r1d}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    [FSCTF2023]ezrev(未解决)

    这一题暂时没有解出flag。

    大致的思路是,main函数传入了四个大整数,

    func1 函数将其转化为字符串,func2函数是base64编码,func3做了一点减法运算。

    我也不太清楚我自己哪里有点问题,解出来的flag特别奇怪。暂时先放一下了。o(╥﹏╥)o还要准备考试了。

    什么时候解出来再更了,而且这题没有官方wpo(╥﹏╥)o。

  • 相关阅读:
    1600*C. Binary String Copying
    【Netty】自定义解码器、编码器、编解码器(十五)
    Redis LRU缓存淘汰算法
    【前端方案】-表格排序列LRU缓存方案
    MySQL
    基于testng的自动化测试框架,自动化集成测试框架,自动本地集成测试框架,自动化单测框架
    pycharm增加新的编译器
    KMP算法——28. 找出字符串中第一个匹配项的下标
    C++ Reference: Standard C++ Library reference: C Library: cmath: hypot
    怎样定制开发小程序微商城_流程_报价_OctShop
  • 原文地址:https://blog.csdn.net/Sciurdae/article/details/134547313