帕鲁杯2024 RE wp

文章探讨了逆向工程中的多种技术应用,如ChaCha20加密算法、TEA算法的识别,Python库PyLu的使用,以及Go语言实现的加密和解密难题,还涉及到了ASCII码和动态调试在解密过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Auth_System

改标志位ZF

2. 茶

壳脱不脱也没啥影响

查一下字符串,有个hint

那就猜测chacha20(根本没想到)

ChaCha20 - Crypto++ Wikiicon-default.png?t=N7T8https://www.cryptopp.com/wiki/ChaCha20

法一:脚本解密

加密需要两个参数,key(16-32字节)和nonce(8字节)

所以Is_This_TEA?只要前八个字节

字符串可以定位到一个初始化的函数,有疑似的参数可以猜测着尝试一下

#cha wp
from Crypto.Cipher import ChaCha20
enc_data = bytes.fromhex("f568c48912eed6dc520c7164f44b6378e1d0d3e248914fa8847b405a131f")
key = b"SGludDogSW1wcm92ZSBvZiBTYWxzYTIw"
 = b"Is_This_"      
cc = ChaCha20.new(key=key, nonce=nonce)       
print(cc.decrypt(enc_data))
#flag{But_I_Like_ChaCha20_More}
法二:动调

chacha20和RC4一样是流密码,可以通过动态调试解密,只要把密文输进去再跑一遍就可以

经过动调可以摸索出大致的逻辑

随便输一串输入,长度尽量长一些方便把密文patch到input里面(密文也可以动调在crypto里取),断在scanf后面

之前得到的密文f568c48912eed6dc520c7164f44b6378e1d0d3e248914fa8847b405a131f是42行转化为16进制之后的结果,不过不方便转化为可见字符,所以我们patch到input里面去

F9到转16进制前面

3. PyLu

注意用最新版的pyinstxtractor.py,不然魔数会有乱七八糟的问题

z3爆一下,要跑一会

#PyLu wp
import z3
from Crypto.Util.number import *
def enc(key):
    R = bytes_to_long(b'Welcome To PaluCTF!')
    MOD = 2 ** 418
    R = R ^ R - 60 >> 24
    R = R ^ R - 60 << 88
    R ^= key
    R = -R * R * 2024 % MOD  #BitVec不支持乘方运算,这里手动改成连乘
    R = R * key % MOD
    return R
cor = 0x2E441F765514CCA89173554726494D37E9FBE774B6F807BC5F6E71117530CE3D7DB5F70554C03CD9055F4E42969600904DF1F4DB8
key = z3.BitVec("key", 418)

s = z3.Solver()
s.add(enc(key) == cor)
s.check()
m = s.model()

flag = long_to_bytes(m[key].as_long())
print(flag)
#b'flag{e88f88d7-4d75-462b-8447-bf4ab7aeab1a}'
4. 帕鲁被病毒攻击了

逆向为啥搞得像Misc!

图片啥也没有,把高度改长一点

得到一个压缩包,里面是一些样本文件

也不知道怎么找,纯Misc题 0n3_n00b_ru1n5_0n3_hundr3d_pr05

5. O2

elf头被改,第五位01改成02(64位)

F5失败,有个函数分析有问题

2356行分析失败了

好像是参数有什么错误,不过直接nop也没影响

重点就第26行

动调找找参数呢,密钥好像怪怪的

密文不知道是哪个,也许是obj

翻一下字符串有些奇怪的东西

定位一下

似乎是密文和key,input是个假的

#O2 wp
from string import printable

enc = bytearray.fromhex("364d4d5c3e387e00421c597a0a7302144d5b70087e064619567336297d151f56770a7935424f2a780643")

key = "PaluCTF"
#爆破
for i in range(len(enc)):
    for c in printable:
        if (ord(c) + ord(key[i % len(key)])) % 128 == enc[i]:
            print(c, end="")
            break
#来自Ciallo~(∠・ω<)⌒☆战队的wp
#flag{d80a0d76-23af-486e-a0bc-43a463eac552}
6. Reverse-签到(什么鬼名字,明明巨难)

Go语言写的,代码非常地难看

大致是把local.txt中的数据加密到encrypted.txt中了

这一部分实际上创建了一个Map集合

Go 语言 Map(集合) | 菜鸟教程

相当于制作了一个字典,将规定的字符映射到一个值(索引值)上

加密过程实际上就是 原字符+索引值

不过解有点多

#re签到 wp
map = {'a':3, 'l':1, 'f':4, 'g':2, '{':-1, '}':-2, '1':5, '2':7, '3':-3, '4':-3, '5':-3, '6':-3, '7':-3, '8':-3, '9':-3}
import string
import itertools  
table = "flag{123456789}"
enc = "jmdiz61904646906034535196{"
flag = [0]*len(enc)
def checkflag(idx,result):
    if(idx == -1):
        print("flag爆破完成!")
        for i in range(len(result)):
            print(chr(result[i]),end="")
        print("")
        return
    for j in table:
        if chr(ord(j) + map[j]) == enc[idx]:
            result[idx] = ord(j)
            checkflag(idx-1, result)
        if(j == 128 and result[idx] == 0):
            return
checkflag(25, flag)
'''
for i in range(0,len(enc)):
    for j in table:
        if chr(ord(j) + map[j]) == enc[i]:
            flag += j
print(flag)
'''
'''
flag爆破完成!
flag{14237171231367868421}
flag爆破完成!
flag{94237171231367868421}
flag爆破完成!
flag{14237971231367868421}
flag爆破完成!
flag{94237971231367868421}
flag爆破完成!
flag{14237179231367868421}
flag爆破完成!
flag{94237179231367868421}
flag爆破完成!
flag{14237979231367868421}
flag爆破完成!
flag{94237979231367868421}
flag爆破完成!
flag{14237171239367868421}
flag爆破完成!
flag{94237171239367868421}
flag爆破完成!
flag{14237971239367868421}
flag爆破完成!
flag{94237971239367868421}
flag爆破完成!
flag{14237179239367868421}
flag爆破完成!
flag{94237179239367868421}
flag爆破完成!
flag{14237979239367868421}
flag爆破完成!
flag{94237979239367868421}
flag爆破完成!
flag{14237171231367868429}
flag爆破完成!
flag{94237171231367868429}
flag爆破完成!
flag{14237971231367868429}
flag爆破完成!
flag{94237971231367868429}
flag爆破完成!
flag{14237179231367868429}
flag爆破完成!
flag{94237179231367868429}
flag爆破完成!
flag{14237979231367868429}
flag爆破完成!
flag{94237979231367868429}
flag爆破完成!
flag{14237171239367868429}
flag爆破完成!
flag{94237171239367868429}
flag爆破完成!
flag{14237971239367868429}
flag爆破完成!
flag{94237971239367868429}
flag爆破完成!
flag{14237179239367868429}
flag爆破完成!
flag{94237179239367868429}
flag爆破完成!
flag{14237979239367868429}
flag爆破完成!
flag{94237979239367868429}
'''
7. Misc签到
27880
30693
25915
21892
38450
23454
39564
23460
21457
36865
112
108
98
99
116
102
33719
21462
21069
27573
102
108
97
103
20851
27880
79
110
101
45
70
111
120
23433
20840
22242
38431
22238
22797
112
108
98
99
116
102
33719
21462
21518
27573
102
108
97
103

中文ASCII码对照表_汉字的ascii码对照表-优快云博客

汉字字符集编码查询;中文字符集编码:GB2312、BIG5、GBK、GB18030、Unicode

也可以用脚本


ascii_text = '''
27880
30693
25915
21892
38450
23454
39564
23460
21457
36865
112
108
98
99
116
102
33719
21462
21069
27573
102
108
97
103
20851
27880
79
110
101
45
70
111
120
23433
20840
22242
38431
22238
22797
112
108
98
99
116
102
33719
21462
21518
27573
102
108
97
103
'''

text = ""

ascii_codes = ascii_text.strip().split()
for ascii_code in ascii_codes:
    char = chr(int(ascii_code))
    text += char

print("转换结果:", text)
#转换结果: 注知攻善防实验室发送plbctf获取前段flag关注One-Fox安全团队回复plbctf获取后段flag
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值