题目描述:菜鸡开始接触一些基本的算法逆向了
下载附件,是一个可执行程序
1. 思路分析
逆向出来看看代码
从代码中来看,密码长度需要和V8相等,并且每一个字符的运算结果需要满足 s[i] == (char)(v8[i % v6 - 8] ^ v8[i])
但是这里有个问题,那就是v8[i % v6 - 8],v6是等于7的,再减去8实际上超出了数组的下标,这里我们注意到v7和v8在内存中是连续的,v7刚好在v8的前面,因此这里的值实际上指向的是v7。
v8的值为 :\"AL_RT^L*.?+6/46,共17个字符,v7值为ebmarah,只有8个字符(最后一个为空字符),根据代码逻辑,将v7循环补齐到17个字符为harambeharambehara(这里注意v7是小端模式,所以需要反向比较),然后再进行异或操作即可
2. 解题过程
根据以上分析写出如下代码进行操作:
str1 = ':\"AL_RT^L*.?+6/46'
str2 = 'harambeharambehar'
# 获取字符串 "str2" 的长度作为参考
length = len(str2)
print(len(str1))
print(len(str2))
output = ""
for i in range(len(str2)):
output += chr(ord(str1[i]) ^ ord(str2[i]))
print(output)
运行后得到结果为:RC3-2016-XORISGUD
总结:这道题除了基本的逆向外,还需要分析flag的计算方式(一定要记住这里面存在小端模式的坑!!!),清楚这些后,简单转换下即可