查下壳 32位,无壳
拖进ida32位
具体的快捷键和操作方式就不加赘述了,不懂的可以去第一篇里面找,第一篇介绍的非常详细
BUUCTF-reverse-reverse1(面向新手超详细)_Dua0g的博客-CSDN博客_buuctf reverse
查看字符串:
一个base64编码表,一个含有flag函数,base64编码原理及解码脚本在专栏CTF逆向的加密与解密这篇里
base64原理及加密C、Python代码_Dua0g的博客-CSDN博客
点进去然后F5查看主函数
老规矩,从下往上看
v5为Des(为了简洁后面把Destination叫为Des)的长度,if里面strncmp判断Des和Str2是否相等,相等则输出正确的flag (同样,不懂这个第30行if()这个函数去上面发的第一篇链接去查找,不加赘述) 所以Str2为flag经过变换后的字符串,点进去看看是啥
接着往上看
将v4的值赋给Des,然后对Des做了一个for循环运算,此处为对Des做的一次变化。
变化为:假设Des长度为10,则第一次循环:Des[0]+0 第二次为:Des[1]+1 .....
先记一下。
继续往上
第22行的函数显然是输入函数,Str为你输入的flag,23行v3是flag的长度,然后关键点就在第24行的函数sub_4110BE对Str做的变换上,点进该函数查看是什么变换
继续点进去
此处教一个简单方法
看到"/3""和*4"是不是想到了什么,没错就是base64对字符的二进制编码做的处理,这是定义了v9和v10来存放base64对字符的二进制变化;倘若你不确定,继续往下看
一个if判断,两个循环(别的题目中也可能是for循环、do循环)结合前面的猜测实锤了函数是base64加密
然后正向总结一下思路:输入了一个Str字符串,然后对字符串做了一个base64加密,该加密的值赋给了v4,v4被赋给了Des,Des做了一个for循环,该循环对Des做了变化,最后倘若Des与Str2相等则输出正确的flag
所以写解密脚本思路为:将Str2逆向还原为Des,再对Des做base64解码
python代码如下:
import base64Des="e3nifIH9b_C@n@dH"flag=""for i in range(len(Des)):flag+=chr(ord(Des[i])-i)print(base64.b64decode(flag))
有点累,不解释代码意思了,不明白这段代码意思的可以私信
flag{i_l0ve_you}