思路:

64位无壳exe

直接使用ida打开

image-20240229201911471.png
image-20240229201911471.png

对变量名进行简单的处理, 提升代码的可读性

对代码进行简单分析

Str2加密的flag

Str为用户的输入

通过三个函数对Str进行三次加密,最终和Str2进行比较

直接看encode_three函数

image-20240229204446829.png
image-20240229204446829.png

这个函数对字符串进行了偏移,有mod操作就不考虑逆向推了,直接使用暴力破解

再看encode_two函数

image-20240229204907302.png
image-20240229204907302.png

这个函数对字符串进行了位移,每次位移13个字符

再看最后一个函数encode_one

image-20240229205021296.png
image-20240229205021296.png

这个函数也是一眼丁真了,base64

image-20240229205047054.png
image-20240229205047054.png

查看alphabet变量,正是base64的码表

写脚本还原flag

exp:

import base64

enc = "EmBmP5Pmn7QcPU4gLYKv5QcMmB3PWHcP5YkPq3=cT6QckkPckoRG"
enc_decode = ""
enc_decoee_2 = ""
for enum in range(len(enc)):
    for enum_char in range(32,128):
        if enum_char <= 64 or enum_char > 90:
            if enum_char<= 96 or enum_char > 122 :
                if enum_char <= 47 or enum_char > 57:
                    if enc[enum] == chr(enum_char): 
                        enc_decode += chr(enum_char)  
                else:
                    if enc[enum] == chr((enum_char - 48 + 3) % 10 +48):
                        enc_decode += chr(enum_char)
            else:
                if enc[enum] == chr((enum_char - 97 + 3) % 26 + 97):
                    enc_decode  += chr(enum_char)
        else:
            if enc[enum] ==  chr((enum_char - 65 + 3) % 26 + 65):
                enc_decode +=  chr(enum_char)
                
enc_decoee_2 += enc_decode[13:26]
enc_decoee_2 += enc_decode[39:52]
enc_decoee_2 += enc_decode[0:13]
enc_decoee_2 += enc_decode[26:39]
print(base64.b64decode(enc_decoee_2.encode()))

总结:

  • 知识点:

    • 暴力破解

flag

GWHT{672cc4778a38e80cb362987341133ea2}