发表于 2019-5-6 00:30

申请会员ID:SuperGate

1、申 请 I D:LCG
2、个人邮箱:Service@52pojie.cn
3、原创技术文章:全国信息安全大赛 2019初赛Reverse方向bbvvmm WriteUp

bbvvmm WriteUp
分析主要流程。发现题目要求我们输入username以及passwd,正确之后执行cat flag。
main流程如下:
https://i.imgur.com/wogEoVt.png
https://i.imgur.com/27xqeqw.png点进sub_405B25函数,发现
https://i.imgur.com/MRByvKU.png大概是在a1处疯狂赋值,大概的格式是一个常数值,一个函数的地址。猜测是vm类型加密。然后在0x6092xx处开辟内存空间并且初始化。所以在后续分析虚拟机的时候要重点关注这几个地方。
接着读入6个字符当作密码。然后sub_406607函数则是对passwd的加密,这个具体后面分析,接着往下看。
sub_4066C0函数是对输入密码的简单加密。大概就是将passwd的ascii码的高低4位分开,然后分别当作低4位,高四位用3填充之后赋值给ai],ai+1]。这个可以笔算。
后面的函数比较复杂……开始光看流程很晕。还好后来看到提示是国密SM4。v17~v32存的是key,最终算算出来的结果根据后面的strcmp参数可以看出来是经过base64加密的,不过base64是变了表的,得找轮子解密。其中新的表在sub_400AA6中可以找到。
所以我们从RVYtG85NQ9OPHU4uQ8AuFM+MHVVrFMJMR8FuF8WJQ8Y=,用base64解密得到EF468DBAF985B2509C9E200CF3525AB6,然后把这个字符串国密解密得到36 32 36 31 36 34 37 32 36 35 37 32 33 31 33 32 ,两个字节一组,依照上述方法解密并转化,得到username:badrer12接下来讨论passwd部分
根据以上分析,passwd是被虚拟机加密了的。所以我开始尝试能否dump出虚拟机的操作码,然后手写脚本跑出来汇编然后分析。但是后来发现虚拟机的各个重要寄存器分析不过来,而且由于涉及到的地址比较多,分析起来很混乱。所以最后采用“猜”密码的方式解决。操作如下:
进入sub_406607函数
https://i.imgur.com/TZNmFhJ.png(a1+56)存放的是虚拟机eip的地址。当eip==0xff的时候虚拟机停止操作。
进入sub_40656D函数
https://i.imgur.com/KLtoYTX.png其中eip指向的地址为下图的数据块
https://i.imgur.com/7em9Kq6.pnga1地址指向的内存为下图的数据块(部分):
https://i.imgur.com/PUjOie1.pngSub_40656D函数流程大致为:i循环枚举上图中最左边一列,然后和eip进行比较,相等了则执行相应函数。相应函数在上图的右边8个字节。
分析后面的判断语句
https://i.imgur.com/uQIG07N.png需要*(ptr+25)的值为0,那么我们随便输入一组密码zbcdef,找到ptr+25相应位置
https://i.imgur.com/HHerwUD.png如图所示,黑圈内的是输入的passwd,红圈内的存的东西则是*(ptr+25)的值(在虚拟机过程中会随运算进行改变),蓝圈内的则是虚拟机计数器,表示当前讨论到了第几位密码位。
那么这个位置的值有什么变化规律呢?我们先大概看一下虚拟机的运行函数
https://i.imgur.com/E74CFKr.png这是一个函数内的变量变化情况,在其他函数中也能找到qword_609240进行了+4或者-4的操作。因此我们有理由猜测该地址为虚拟栈顶,我们因此可以追溯到栈的位置。输入密码为abcdef时,虚拟栈在运行一段时间之后如下所示
https://i.imgur.com/WX5rZJs.png容易看到出现了61,62,63,64,这正是我们输入的abcd的ascii码,可以猜测这里对密码位进行了操作。并且在后续跟进中可以发现,最右列应该是分别对应了相应的密码位的加密,并且最右列的和刚好和虚拟机进程完成之后的*(ptr+25)的值相等!
所以我们现在的任务是找出每一位相应的字符,使得算出来的最右一列等于0,这样相加之后才能等于0,passwd才能正确。
那么78 79 7A 7B和19 1b 19 1f又有什么含义呢?我们尝试将密码输入改为bbcdef
https://i.imgur.com/Hi7MsVO.png发现变的只是最右边一列(最左边是地址,所以不管)。除了第一个密码位对应的19变为了1a,没有其他变化。而a->b ascii码增量为1,正好对应了19->1a的增量!
为了验证猜测,我们用zbcdef密码来测试
https://i.imgur.com/Nh2S1FV.png答案很依旧,仍然是第一行最右列发生了改变,不过没有像我们预期的变得比19,1a大。不过没关系,因为我们用ybcdef测试之后发现最右一位刚好等于01了。说明a-z是和19-02分别对应的。因此为了使第一位为0,我们将第一位设置为x,发现确实如我们所愿。
因此。我们分别测试第二位,第三位……的映射关系,发现最终密码应该为xyz{|}。至此,问题得到了解答

Hmily 发表于 2019-5-6 14:51

复制都不改信息?名字邮箱是你的吗?
页: [1]
查看完整版本: 申请会员ID:SuperGate