攻防世界(getit)
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 | 1.gdb -q 文件名 //让其在gdb里运行 |
我这里用到了gdb的插件peda,这个插件可以强化视觉效果,可以更加清楚的显示堆栈,内存,寄存机的情况,想去下载的小伙伴,可以点这里
SharifCTF{b70c59275fcfa8aebf2d5911223c6589}
2.静态分析
脚本如下:
1 | s='c61b68366edeb7bdce3c6820314b7498' |
运行结果:
再加一个外壳就行。
总结:
1.动态调试的要找好断点,我也是试了几次才找到的
2.静态分析的脚本用python更快
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo!