[HNCTF 2022 WEEK4]flower plus

最后更新于 2024-08-10 400 字 预计阅读时间: 2 分钟


PE32位,ida打开,如题所述,有很多花指令但是只有两种

上述花指令保存ebx的值后xor ebx,ebx后ebx为0,到jz后必然跳转到401219,故可以将箭头处nop

上述call后跳转到40135e故esp的值为call下一条指令的地址40135d,add [esp],8后esp的值为40135d+8=401365,ret后eip为401365,手动识别代码,将箭头处nop

按p生成函数得到反编译后的main函数

输入flag后进入401030函数后进行循环异或进入40128f比较

401030为rc4加密,但是改变了位移和密钥以及与密文异或的索引

原密钥为Hello_Ctfers!!!长度为15,但参数传进去为16,故要在密钥尾部加上\x00.

rc4密文的范围在0-255之间但是所给的密文大于255故需要&0xff

exp

# RC4加密
def rc4(key, ciphertext):
    sbox = list(range(256))
    j = 0
    for i in range(256):
        j = (j + sbox[i] + key[i % 16]) % 256
        sbox[i], sbox[j] = sbox[j], sbox[i]
    i = 0
    j = 0
    keystream = []
    for _ in range(len(ciphertext)):
        i = (i + 3) % 256
        j = (j + sbox[i] +1) % 256
        sbox[i], sbox[j] = sbox[j], sbox[i]
        k = sbox[(sbox[i] + sbox[j]) % 256]
        keystream.append(k)

    # 解密密文
    plaintext = []
    for i in range(len(ciphertext)):
        m = (ciphertext[i] ^ keystream[i])&0xff
        plaintext.append(m)
    print(plaintext)

    return ''.join([chr(p) for p in plaintext])

key_arr=[]
v16=[4026531853, 4026531904, 268435366, 268435439, 4026531962, 4026531961, 4026531924, 4026531967, 268435397, 4026531887, 4026531906, 268435389, 268435428, 268435348, 268435348, 268435343, 4026531878, 4026531850, 268435386, 268435336, 4026531856, 4026531967, 268435443, 268435365, 7, 75, 50]
key = "Hello_Ctfers!!!"
for x in key:
    key_arr.append(ord(x))
key_arr.append(0)
plaintext = rc4(key_arr, v16)
print(plaintext)



此作者没有提供个人介绍。
最后更新于 2024-08-10