前言
BUUCTF刷题记录,本题主要是一道C++程序题,主要在于理清代码逻辑,c++的反汇编伪代码看的还不是很熟练。
一、题目分析
代码稍长,可以分段看,首先来到第一段,是一个获取输入的部分:
这里有一个容易看错的地方,就是存储输入的那个变量叫Code,然后v6指向的内容也叫Code,但是这两个不是一个东西,后者跟进去后可以看到如图上标注所示
这里是最后一个异或的逻辑,相当于从v20[3]开始,每一位都会和前面的几个数据循环异或,范围就是range(i//3),逆的时候从后往前算
总体的逻辑差不多是这样,但是在解的时候卡在了解密xxtea上,虽然这里之前遇到过很多次xxtea解密的题,手上也有现成脚本,但是刚开始没解出来答案,后看看了下其他师傅的WP,发现是密钥key找错了,这里我们可以回顾加密那里,传入的密钥是&v30,这个地址指向的内容是输入的前4位+后面都是0,长度为16字节,跟进加密算法:
前面很大这一坨应该就是在生成密钥那个列表v18,xxtea加密的密钥是四个unsigned int,所以这部分就是在从&v30这里读出4个unsigned int,后面三个其实都是0,理清这些,直接上脚本解题。
二、代码示例
import libnum
enc = [0xce,0xbc,0x40,0x6b,0x7c,0x3a,