BUUCTF [MRCTF2020]Transform

把文件拖入IDA

shift+F12查看可疑字符串 看到flag 继续跟进

查看主函数 F5查看伪c代码

这个程序是一个简单的谜题或挑战,要求用户输入一个长度为33的字符串,该字符串经过特定的处理(使用dword_40F040数组作为索引和异或密钥)后,必须与byte_40F0E0数组中的值完全匹配。成功匹配后,程序会打印出用户的输入作为“标志”,并结束。

第一个for循环遍历Str的每个字符。对于每个字符,它使用dword_40F040[i]作为索引从Str中取出字符,然后将这个字符赋值给byte_414040[i],并对这个字符进行异或操作,异或的值为dword_40F040[i]的低字节(LOBYTE(dword_40F040[i]))。

找到dword_40F040和byte_40F0E0的值

这个加密的思路是将str先赋值再异或

那逆向的思路是先异或再赋值

编写反脚本

# 定义字节和 dword 数组  
byte_40f0e0 = [0x67, 0x79, 0x7B, 0x7F, 0x75, 0x2B, 0x3C, 0x52, 0x53, 0x79, 0x57, 0x5E, 0x5D, 0x42, 0x7B, 0x2D, 0x2A, 0x66, 0x42, 0x7E, 0x4C, 0x57, 0x79, 0x41, 0x6B, 0x7E, 0x65, 0x3C, 0x5C, 0x45, 0x6F, 0x62, 0x4D]  
dword_40F040 = [0x09, 0x0A, 0x0F, 0x17, 0x07, 0x18, 0x0C, 0x06, 0x01, 0x10, 0x03, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16, 0x04, 0x0D, 0x13, 0x14, 0x15, 0x02, 0x19, 0x05, 0x1F, 0x08, 0x12, 0x1A, 0x1C, 0x0E, 0x00]  
  
# 初始化结果字符串列表  
Str = [0] * 33  
  
# 进行异或操作并存储结果  
for i in range(33):  
    Str[dword_40F040[i]] = byte_40f0e0[i] ^ dword_40F040[i] 
  
# 将结果列表转换为字符串  
flag = ''.join(chr(c) if c != 0 else '' for c in Str)  
  
# 打印结果  
print(flag)    
  

得到flag

记得用flag{}包裹

flag{Tr4nsp0sltiON_Clph3r_1s_3z}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值