2024第四届“网鼎杯”朱雀组 writeup
2024-11-6 16:2:0 Author: mp.weixin.qq.com(查看原文) 阅读量:0 收藏

招新小广告CTF组诚招re、crypto、pwn、misc、合约方向的师傅,长期招新IOT+Car+工控+样本分析多个组招人有意向的师傅请联系邮箱

[email protected](带上简历和想加入的小组)

Reverse

Re1

SMC

写个idapython patch一下

start = 0x140003000
for i in range(0x600):
    PatchByte(start+i, (Byte(start+i)+0x42)&0xff)

base24

叫gpt帮忙写一个解密就行

# -*- coding: utf-8 -*-
import libnum
 
def decode_base24(ciphertext, code_table):
    """
    Decodes a base24 encoded string using a custom code table.
    
    :param ciphertext: The base24 encoded string to decode.
    :param code_table: A string containing all the characters in the base24 code table.
    :return: The decoded string.
    "
""
    # 将密文字符串中的每个字符转换为其在码表中的索引
    temp = [code_table.index(char) for char in ciphertext if char in code_table]
    
    # 将索引转换为十进制数
    num = 0
    for i, value in enumerate(temp):
        num += value * (24 ** (len(temp) - i - 1))
    
    # 将十进制数转换为字符串
    decoded_bytes = libnum.n2s(num)
    
    # 解码为可读字符串
    decoded_string = decoded_bytes.decode('utf-8', errors='ignore')
    
    return decoded_string

# 自定义码表
base24_code_table = "4836CR7F9TXGQVWYB2JPHKDM"

# 放入密文
ciphertext = "4FKMKYP497G87QXHBTRJKCGM63XXCC8CDQX39TQPYFY"

# 解码
decoded_string = decode_base24(ciphertext, base24_code_table)

print(decoded_string[::-1])

Re2

Vmp的壳子

不好脱,直接字符串大法搜索关键函数。

发现有些关键信息,比如勒索病毒加密等。

跟进svchost.exe字符串发现存在一个异或解密,配合字符串信息大致认为解密后释放了一个svchost.exe程序或者注入进了svchost进程。

丢沙盒里检测可以看到确实如此。

因为存在断点check,所以先运行再瞬间断点,即可绕过。

把0x3650048的数据提取出来再异或。

可以看到elf文件中对文件进行了加密。

典型的aes加密

Key导出来则是:3b7e151638aed2a6bbf7158819cf4f3c
赛博厨子加上xor爆破解密得到flag

crypto

crypto002

这一题没啥好说的,1024的n,给了p的高256,就是一个已知p高位攻击,稍微爆破几个比特就行了。具体爆破多少位,取决于你设置的 epilon是多少,8比特差不多要0.01,12比特要0.02,我的电脑差不多一个小时。

crypto003

第一问给的是

p1 = getPrime(1024) q1 = nextprime(2024 * p1)

直接对 n1/2024 开跟就能得到一个素数了

第二问是

n2 = p2 * q2 n22 = p2 * p2 + q2 * q2

解方程,没啥说的。

第三问

r = random.getrandbits(1024)
p3 = r
while not is_prime(p3):
    p3 += random.getrandbits(400)
q3 = r
while q3 < p3:
    q3 += random.getrandbits(500)
while not is_prime(p3):
    q3 += random.getrandbits(500)
n3 = p3 * q3
f.write("n3 = {0}\n".format(n3))

这里题目有点问题,都是以 p3 是否为素数来结束循环,所以q3其实不是一个素数。。。

但比赛的是时候没想那么多。测试发现就是直接对 n3 开根就能得到 p3 的高位,然后就是一个p的已知高位攻击。

最后一问才是这一题最难的地方,

m1 = p1 * m * m + p2 * m + p3
m2 = q1 * m * m + q2 * m + q3
c1 = pow(m1, e, n)
c2 = pow(m2, e, n)

这里根据前面我们已经获得到 p1,p2,p3,q1,q2,q3,只有未知数m

并且m是两个方程,也就是 f(m) = p1 * m * m + p2 * m + p3,g(m)=q1 * m * m + q2 * m + q3的共根。这里引用明文相关攻击的思路,就是对两个多项式求一个 GCD,但是直接GCD可能会爆递归深度,这里用的是 fast_polymonial_gcd,当初做seectf遇到的 https://jayxv.github.io/2023/06/15/2023%20seectf/,罗密欧朱丽叶这一题。

结束

招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系[email protected]


文章来源: https://mp.weixin.qq.com/s?__biz=MzIzMTc1MjExOQ==&mid=2247511399&idx=1&sn=273c780a71db7f58e52566ae018cf950&chksm=e89d85bfdfea0ca99659dfcd12362619e8e4249bda58a995e0895c879f5f099b3ecbd0851574&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh