WolvCTF2024 一道RE题目的分析

doubledelete's revenge:

这道题给了两个附件:reveng1(elf)和一个未知格式文件 flag.txt.enc

hxd看一下这个文件

应该是加密过的文件

再来分析一下elf

程序逻辑是读取文件,然后进行加密,然后再写出文件,刚才那个 flag.txt.enc

加密过程:

fread(ptr, 1uLL, 0x30uLL, stream);          // 读取数据到ptr
    for ( i = 0; i <= 11; ++i )
      ptr[i] = __ROL4__(ptr[i], 13);

看伪代码猜测是读取的数据每四个字节循环左移13位,可以看一下汇编判断

loc_1260:
mov     eax, [rbp+var_5C]
shl     eax, 2
cdqe
lea     rdx, [rbp+ptr]
add     rax, rdx
mov     [rbp+var_48], rax
mov     rax, [rbp+var_48]
mov     eax, [rax]
rol     eax, 0Dh
mov     edx, eax
mov     rax, [rbp+var_48]
mov     [rax], edx
add     [rbp+var_5C], 1

确实是循环左移13位,那解密直接循环右移13位即可

f=open("flag.txt.enc","rb")
byte_data=f.read()
reversed_byte_data = byte_data[::-1]
def rol(num, bits):
    return ((num >> bits) | (num << (32-bits))) & 0xFFFFFFFF


data=[]
for i in range(0,len(byte_data),4):
    hex_data=int(reversed_byte_data[i:i+4].hex(),16)
    data.append(hex_data)
    print(hex(hex_data))

data.reverse()
flag=""
for num in data:
    new_num=rol(num,13)
    print(hex(new_num))
    by_data = new_num.to_bytes(4, byteorder='little')
    for i in by_data:
        flag+=chr(i)

print(flag)
#wctf{i_th1nk_y0u_m1sund3rst00d_h0w_r0t13_w0rk5}

 

posted @ 2024-03-20 20:49  GGBomb  阅读(7)  评论(0编辑  收藏  举报