1.拿到题目的文件
解压
得到一个名为chall的文件
进行查壳
收集信息,64位程序
2。拖入ida中
这就是主程序
大概的意思就是当a2=zer0pts{********CENSORED********}的时候就会输出Correct!
把这个字符串带回网站进行验证
发现是错误的
那么
真実は一つだ(真相只有一个)
这个题没有这么简单😎😎
3.我们来看这个题目中出现过的函数
看完每个函数里面的东西后,我们发现sub_6EA函数有很大的作案嫌疑😎(它对字符串进行了某种不可告人的处理)
我们跟进qword_201060数组,可以得到它的值
我们可以看出来,它对于这个数组进行储存的时候是小端序储存(大端序和小端序_Casuall的博客-CSDN博客_大端序和小端序的区别)
所以在写脚本的时候,要注意进行倒序
我们马上对这个sub_6EA函数进行分析
好了,我们有后面数组的值了,还有相减后的值,即( zer0pts{********CENSORED********})
接下来,上脚本
一、难以理解的脚本
enc = "********CENSORED********"
m = [0x410A4335494A0942, 0x0B0EF2F50BE619F0, 0x4F0A3A064A35282B]
import binascii
flag = b''
for i in range(3):
p = enc[i*8:(i+1)*8]
a = binascii.b2a_hex(p.encode('ascii')[::-1])
b = binascii.a2b_hex(hex(int(a,16) + m[i])[2:])[::-1]
flag += b
print (flag)
得到flag{l3ts_m4k3_4_DETOUR_t0d4y}
带到网站进行验证
正确!!!!!
二、比较容易理解的脚本
我们将 qword_201060数组里面的值转换为10进制
我们把********CENSORED********也转换为10进制
接下来就是依次相加(要注意有的字节大于127 是以补码形式存在的负数 需要另行还原)
其中为什么要把数组&0xff?
那是因为
byte类型的数字要&0xff再赋值给int类型,其本质原因就是想保持二进制补码的一致性。
a=[66, 9, 74, 73, 53, 67, 10, 65, 240, 25, 230, 11, 245, 242, 14, 11, 43, 40, 53, 74, 6, 58, 10, 79]
b=[42, 42, 42, 42, 42, 42, 42, 42, 67, 69, 78, 83, 79, 82, 69, 68, 42, 42, 42, 42, 42, 42, 42, 42]
f=''
for i in range(24):
if a[i]<127:
f+=chr(a[i]+b[i])
else:
f+=chr(b[i]-(((~(a[i]))&0xff)+1))
print(f)
最后得到一样的flag
带到网站,验证
正确!!!!!!