getit

1.下载附件并查壳
在这里插入图片描述
elf文件且是64位
2.用ida64打开,找到main函数f5,开始分析
在这里插入图片描述

(/tmp是linux临时文件夹,运行完之后就被清理了。)

可以看到先判断v5是否大于s存储字符串的长度,然后通过运算,最后将得到的flag写入文件
两种方法,
1.动态调试
思路:在flag文件未被删除前,查看他。
1.我们向下追踪,追踪到for循环的位置,因为,flag是在这里存入文件的,所以,我们可以在内存中找到正要存储的字符串
我们将鼠标指向strlen(),在下面可以看到汇编所在的地址,然后我们根据大概的地址去看汇编代码
在这里插入图片描述
在这里插入图片描述

可以看到这是调用strlen()函数的汇编指令

我们通过第一个图片,可以知道经过for()的判断条件后,还要进行一步fseek函数,所以,根据汇编代码,可以确定jnb loc_4008B5就是fseek()函数,那么,mov eax,[rbp+var_3C]肯定就是最后要得到的flag了
2.下面就要去linux调试它了
首先

1
2
3
1.gdb -q 文件名 //让其在gdb里运行
2.b *0x400832 //下断点
3.r //运行

在这里插入图片描述
我这里用到了gdb的插件peda,这个插件可以强化视觉效果,可以更加清楚的显示堆栈,内存,寄存机的情况,想去下载的小伙伴,可以点这里
SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

2.静态分析
脚本如下:

1
2
3
4
5
6
7
8
9
10
11
s='c61b68366edeb7bdce3c6820314b7498'
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)

运行结果:
在这里插入图片描述
再加一个外壳就行。

总结:
1.动态调试的要找好断点,我也是试了几次才找到的
2.静态分析的脚本用python更快