首先我们先下载提供的附件,用Exeinfo PE打开查看信息
是一个64位的ELF文件,无壳,接下来就用ida64去打开
然后进入主函数查看伪代码
这是我们去分析伪代码
首先给 v5 赋了 0 为初值,然后在 while 循环里与 s 的长度进行比较,我们就追踪 s 查看其内容
s 为一串字符,暂不知含义,继续看,
进行了一个(v5 & 1)的运算,实际上就是判断v5的二进制最后一位是否为1若是返回值为 1,否则为 0,实际就是判断奇偶数,最后一位为1,为奇数 v3=1,否则为偶数 v3 = -1;
这里将 s[v5] 加上 v3 填充到 t 的首地址加 10 加 v5 处,这时我们跟踪 t 查看 t 的内容
我们看到一串字符,貌似就是我们所要 求的 flag 但大括号内部为问号,这时我们想到上面所做的运算,填充的内容正好就是从第一个问号开始的,这时先不急着去写代码,继续往下看
打开一个名为"flag.txt"的文件,然后 fprintf() 函数将 u 和 v5 写入文件
我们去看u的值
我们发现u 的长度和上面计算得到的字符长度一样,这时我们就确信上面计算的字符就是本题flag
我们现在就去编写脚本
s = "c61b68366edeb7bdce3c6820314b7498"
t = '????????????????????????????????'
print(len(t) == len(s))
v5 = 0
flag = ' '
while v5 < len(s):
if v5 & 1:
v3 = 1
else:
v3 = -1
flag += (chr(ord(s[v5])+v3))
v5 += 1
print(flag)
最后计算出大括号内的内容
b70c59275fcfa8aebf2d5911223c6589
然后就得到本题flag
SharifCTF{b70c59275fcfa8aebf2d5911223c6589}
这样本题就结束了