一.[MRCTF2020]Transform
64位无壳,IDA打开发现main函数进入反编译
阅读程序
先输入33位code再加密处理然后验证是否相等的题型
逆向看,验证数组byte_40F0E0已知
再往上看加密处理方式
就是将Str(我们输入的flag)的每一个索引处的值与其索引进行异或运算,但是这个索引是打乱的不是按照顺序来的
我们已知异或是可逆的,所以将用来验证的数组(即处理后的数组(也是根据乱序索引数组打乱的))与乱序索引数组异或就得到了乱序的原flag
补充 :LOBYTE 取低8位即低字节的意思,这里乱序索引数组是int整形4个字节,但是索引都是0-255(一字节8位,2的8次方-1)所以有效数据都存在于低字节,就不需要管了
补充 :异或 是建立在二进制上的,同0不同1
补充:**8 dup(0)**是8个存储单元都置0(刚开始这里索引只有32个数据没有0优点懵,现在明白了最后一个是0)
写脚本:
python
flag = [0]*33
print(flag)
b = [103, 121, 123, 127, 117, 43, 60, 82, 83, 121, 87, 94,93, 66, 123, 45, 42, 102, 66, 126, 76, 87, 121, 65,107, 126, 101, 60, 92, 69, 111, 98, 77]
print(len(b))
a = [9, 10, 15, 23, 7, 24, 12, 6, 1, 16, 3, 17, 32, 29, 11,30, 27, 22, 4, 13, 19, 20, 21, 2, 25, 5, 31, 8, 18,26, 28, 14,0]
print(len(a))
for i in range(33):
flag[a[i]] = chr(a[i]^b[i])
print(''.join(flag))
补充 :这里直接复制已知数据不方便,可以Shift+E键提取数据
补充 :列表按照索引存储要先占位(申请存储空间),所以这里[0]*33就可以实现
得到MRCTF{Tr4nsp0sltiON_Clph3r_1s_3z}