题目信息
本题目来自于2020年羊城杯的逆向题,可以在buuoj上找到题目复现。
考查知识
本题目考查的知识点有:DES/AES算法,SMC自修改代码,以及合理利用动态调试来快速解题。
关于动态调试,这里很多人可能会遇到环境问题,主要是因为题目调用了openssl的动态加密算法库,所以本地也得有一个。同时还需要注意openssl加密算法库的版本问题,该题目必须使用libcrypto.so.1.0.0。这里我给出该算法库文件 – libcrypto.so.1.0.0,可以不用完整安装openssl,将该文件放到/usr/lib
目录下即可。
题目分析
如下截图所示,展示的是程序main函数的逻辑,一开始的sub_402563
函数即是SMC代码,会修改最后面if判断中的sub_40272D
,这里由于我已经动态调试并重新定义了一个函数,所以显示的是这样,没有修改过的话显示的只是一个地址。因此绕过该SMC也比较简单,直接动态调试运行到代码12行后即可,当然如果想静态分析的话,可能会有点繁琐,该函数点进去后的执行逻辑还是比较多。
简单说下这里的主逻辑,将输入的16字节长的字符串用DES加密后和byte_6040C0
数组进行比较,相同则进入到sub_40272D
函数中。这里提示一点,DES_string_to_key
函数并不是把this is my key
直接作为key,相反是会按照算法生成一个8字节密钥存储在v6变量中,因此可以通过动态调试得出,每次的值是固定的。
下面看看sub_40272D
函数的主逻辑,如下截图所示,这里一开始又会让我们输入一串字符,中间三个未命名函数是AES加密算法,可以通过插件Findcrypt快速帮我们判断,而AES所需要的key就是一开始输入的16字节长字符串。
至此,题目的逻辑就很清楚了,将一开始输入的字符串作为这里AES加密的密钥,然后这里需要我们输入32字节长的字符串也就是flag。将flag作A