polarCTF RE刷题记录

Gobang

查壳并脱壳

1156e592eddd72eda461c70aa738ee43

放入ida

image-20260120170556345

image-20260120170615283

主要验证逻辑在judge函数,,循环i=2到6检查(2,2)(3,3)等位置是否有棋子,全部都有就成功(flag=1)

eb29381ac6d6b8ed72f5480829ba4177

等待五秒就会关闭

点击+++

打开附件有四个文件image-20260120171144624

其中点击+++有upx壳,脱壳后ida打开可得到flag1 xoisnkcizoimage-20260120171515657

transform无壳,打开后是加密字符串逻辑,加密的什么呢,就是看那个1和密钥文件。把1在veracrypt中挂载,然后选择密钥文件,会有提示是aes加密,然后打开挂载磁盘,会出现flag2和transform.exe,(这里没图片是因为vera不让截图),flag2里是一串加密的十六进制数据0x9B 0x4B 0x7B 0xC3 0xD3 0x73 0x0B 0x9B,就可按照transform逻辑进行解密,image-20260120172418233

加密逻辑是把原始值的二进制同时左移三位和右移五位然后合并结果(八位循环左移三位),解密就是反过来,代码如下

def solve():
    # 加密字节序列
    cipher_bytes = [0x9B, 0x4B, 0x7B, 0xC3, 0xD3, 0x73, 0x0B, 0x9B]

    decrypted_chars = []

    print("开始解密...\n")
    print(f"{'加密值':<10} {'二进制':<12} -> {'解密值':<10} {'字符'}")
    print("-" * 50)

    for b in cipher_bytes:
        # 解密逻辑:循环右移 3 位 (Rotate Right 3)
        # 1. b >> 3: 将高 5 位移回原来的低位
        # 2. b << 5: 将低 3 位移回原来的高位
        # 3. & 0xFF: 确保结果保留在 8 位以内
        original_byte = ((b >> 3) | (b << 5)) & 0xFF

        char = chr(original_byte)
        decrypted_chars.append(char)

        # 打印详细过程
        print(f"0x{b:02X}       {b:08b}     -> 0x{original_byte:02X}       '{char}'")

    result = "".join(decrypted_chars)
    print("\n" + "-" * 50)
    print(f"最终解密字符串: {result}")

if __name__ == "__main__":
    solve()

得到flag2为sioxznas,拼接就是最终flag

老八小冒险

运行niceman.exe得到niceman文件夹,真正的游戏在文件夹中,image-20260120195524463

第一关的史莱姆很好欺负,不用作弊就能拿到flag第一部分225fdd3ae935a3bd7653fcbc7bb944cf16f5743880e0657c46a77fabb2ed2f7c

这个魅魔表示不吃压力,HP达到了惊人的114514,并且还能躲过攻击,二次攻击,极肉无比。
用CE打开发现搜不出来游戏的数值,于是可推出这个游戏的血量什么的是被加密了,那么我们就新建扫描image-20260120200545523

然后攻击什么的,再选择变动的值进行下一次扫描image-20260120200653066

一直死一直试,最终可得出,游戏的值×2+1=内存里的值,然后就可以修改魅魔的生命值8a31c585-3a1f-4f2e-b8f5-c7af9b5f3955

得到flag第二段image-20260120201359009

然后是第三关魔神image-20260120201428779

同样的操作更改魔神生命值,得到第三段image-20260120201650431image-20260120201705770

o_O、UU加速、往哪走

都是只用ida就能做的,简单带一下
o_O就是输入一个整数,将其转为十进制存入vector内存,然后反转(就是交换第一个和最后一个,第二个和倒数第二个,第三个和倒数第三个),接着每个数字乘十与arr数组比较。

_arr            DCD 0x5A, 0x14, 0xA, 0x32, 0, 0, 0x14

arr = [90,20,10,50,0,0,20],所以这个数为2005129.然后md5即可 flag{7e4e85033d36b28767243dcb3d9c7049}image-20260120203911230

uu加速程序打开是叫我们加微信购买什么的,用ida打开发现有两种方式能做,一种是在当前目录创立一个request.txt文件,里面的内容符合要求就能通过检测,一种是直接解出flag,image-20260120204427378

这是加密的字符串,解密逻辑是首先用初始值54与key80异或,然后密文依次赋值给n54与key异或image-20260120205713551

解密代码

# 密钥
key = 80

# 密文
ciphertext = b'6<17+4?v>?$v5>7175v9>v9>6"9>79>7v3"13;9>7v2581&9?"-'

# 解密逻辑
plaintext = []
# 初始 n54 值
n54 = 54

for i in range(len(ciphertext)):
    # 异或
    plaintext.append(chr(n54 ^ key))
    # 更新 n54 为密文的下一个字节
    n54 = ciphertext[i]

# 输出结果
print(''.join(plaintext))

往哪走迷宫,1是墙 flag就是222441144222

*1111
01000
01010
00010
1111#

26f97f4e-b336-4ad4-b316-1c27fe18898d

分类: study

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注