好吧,自己分析一波,先拖到windows的虚拟机里面
查一下基本PE信息,是用golang写的,确实我是用golang写的
没壳没花,直接拖到IDA分析一波。
字符串先来一波,看到很可疑的16进制的字符串
应该就是最终对比结果了,直接往上追踪。
可以看到sub_496B80()是完整的逻辑验证。
往上走一走,就能看到最终处理的函数是sub_496920(),继续往下的sub_403180()其实只是类似于内存比较函数,最终与16进制字符串对比。
那么就重点关注sub_496920()
看图形化逻辑分析也能看到和题目名称交相辉映的four
根据题目的four提示,以及通过分析方法,可以发现存在四层加密:
解密步骤:
1、将十六进制字符串转换为字节再通过替换表逆向还原
2、凯撒密码解密(偏移量为-3)
3、Base64 解码
4、异或解密(XOR with 0x42)
这里是不是懵逼了?F5反编译不了成伪代码了啊,叫你好好学汇编,你偏要去放牛~~~~
还是简单说一下吧
1、第一个循环(0x496959-0x49696C):
// 对输入进行异或0x42的操作
for(int i = 0; i < len; i++) {
output[i] = input[i] ^ 0x42;
}
2、第二个循环(0x4969AD-0x496A0F):
// 对字符进行处理
for(int i = 0; i < len; i++) {
char c = input[i];
// 处理小写字母a-z
if(c >= 'a' && c <= 'z') {
int x = ((c - 0x5E) * 0x13C) >> 0xD;
x *= 0x1A;
c = (c - x + 3);
}
// 处理大写字母A-Z
else if(c >= 'A' && c <= 'Z') {
int x = ((c - 0x3E) * 0x13C) >> 0xD;
x *= 0x1A;
c = (c - x + 3);
}
output[i] = c;
}
3、最三循环(0x496AE0-0x496B1E):
// 将处理后的字符转为16进制字符串
const char hex[] = "0123456789abcdef";
for(int i = 0; i < len; i++) {
char c = input[i];
output[i*2] = hex[(c >> 4) & 0xF];
output[i*2+1] = hex[c & 0xF];
}
直接放一个python解题脚本吧~~~~~~这里上不了汇编课
import base64
def hex_to_bytes(hex_str):
"""将十六进制字符串转换为字节"""
return bytes.fromhex(hex_str)
def create_reverse_substitution_table():
"""创建反向替换表"""
substitution_table = {
'a': 'q', 'b': 'w', 'c': 'e', 'd': 'r', 'e': 't',
'f': 'y', 'g': 'u', 'h': 'i', 'i': 'o', 'j': 'p',
'k': 'a', 'l': 's', 'm': 'd', 'n': 'f', 'o': 'g',
'p': 'h', 'q': 'j', 'r': 'k', 's': 'l', 't': 'z',
'u': 'x', 'v': 'c', 'w': 'v', 'x': 'b', 'y': 'n',
'z': 'm', '@': '#', '{': '<', '}': '>', '_': '-',
'1': '7', '2': '8', '3': '9', '4': '0', '0': '6'
}
# 创建反向映射
return {v: k for k, v in substitution_table.items()}
def reverse_substitution(encrypted_text, reverse_table):
"""反向替换解密"""
result = []
for char in encrypted_text:
char = chr(char)
if char in reverse_table:
result.append(reverse_table[char])
else:
result.append(char)
return ''.join(result)
def caesar_decrypt(text, shift=3):
"""凯撒密码解密"""
result = []
for char in text:
if char.isalpha():
# 确定字符范围(大写或小写)
ascii_offset = ord('A') if char.isupper() else ord('a')
# 解密并确保在字母范围内
decrypted = chr((ord(char) - ascii_offset - shift) % 26 + ascii_offset)
result.append(decrypted)
else:
result.append(char)
return ''.join(result)
def xor_decrypt(data, key=0x42):
"""异或解密"""
return bytes([b ^ key for b in data])
def decrypt_flag(encrypted_hex):
"""完整的解密过程"""
# 1. 转换十六进制为字节
encrypted_bytes = hex_to_bytes(encrypted_hex)
print(f"[+] 十六进制解码后: {encrypted_bytes}")
# 2. 替换表解密
reverse_table = create_reverse_substitution_table()
substitution_decrypted = reverse_substitution(encrypted_bytes, reverse_table)
print(f"[+] 替换表解密后: {substitution_decrypted}")
# 3. 凯撒密码解密
caesar_decrypted = caesar_decrypt(substitution_decrypted)
print(f"[+] 凯撒解密后: {caesar_decrypted}")
# 4. Base64解码
base64_decrypted = base64.b64decode(caesar_decrypted)
print(f"[+] Base64解码后: {base64_decrypted}")
# 5. 异或解密
final_result = xor_decrypt(base64_decrypted)
print(f"[+] 异或解密后: {final_result.decode()}")
return final_result.decode()
def main():
# 加密后的十六进制字符串
encrypted_hex = "4d4630644d576637447350634d576c654f4536494a71376d796a45384b55704d4b5444494657383d"
print("=== Flag 解密过程 ===")
flag = decrypt_flag(encrypted_hex)
print("n[*] 最终 Flag:", flag)
if __name__ == "__main__":
main()
题目下载:关注公众号回复ctf_re_four即可
原文始发于微信公众号(蓝极战队):[REVERSE]我出的题大家觉得BT,毕竟大家都在F5伪代码
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论