首页 技术 正文
技术 2022年11月14日
0 收藏 769 点赞 3,600 浏览 2607 个字

目录

cm1 逆向分析

前言

还是先推荐你们看完《恶意代码分析实战系列文章》,并且有兴趣的可以看我最近刚做完的笔记《王爽汇编》,做逆向分析的话还是要对汇编有所了解,入门的话推荐看王爽老的汇编语言第4版。

查壳分析

显示了用UPX加壳,在恶意代码分析实战文章中有介绍如何脱UPX壳。

利用Free UPX来脱壳。

脱壳成功,显示无壳。

逆向分析

接着打开IDA,拖入程序后按F5进行反编译

得到main函数伪代码

代码分析

qmemcpy分析

  1. 分析qmemcpy

为了更加方便阅读,我们可以将v9这个变量重命名为szDest.

更改后

sub_401020函数分析

再接着往下看的时候,会发现有这两个sub_401020函数,并且有两个参数,第一个参数是字符串,第二个参数看着像可变参数,如下:

我们鼠标双击sub_401020,跳进去看看,发现其实就是一个printf函数,那我们重命名sub_401020printf.

sub_401050函数分析

这里请大家先自行分析,并注明此函数的功能,再看文章,相信聪明的你已经知道该如何分析这函数了。

和上面分析ptinf一样的流程,双击进去后发现scanf关键字,所以此函数为scanf函数

加密算法分析

从上面的分析中可以看出,我们输入的szInput要和szDest变量的内容相等才行,那么szDest是什么内容呢?之前我们分析qmemcpy函数的时候讲过,他其实是将dnceyK]uclv]vm]rpmvgavgf]o{]amfg字符串拷给了szDest,所以目前szDest内容为dnceyK]uclv]vm]rpmvgavgf]o{]amfg,但是先别急,我们再来看看strcnmp函数上面还有这么一句代码.

 for ( i = 0; i != 32; i += 16 )
*(__m128i *)&szDest[i] = _mm_xor_si128(*(__m128i *)&szDest[i], (__m128i)xmmword_402190);
LOBYTE(v10) = v10 ^ 2;

首先,这里i=0,i!=32;i+=16,理解成循环两次,i每次+16,接着有个奇怪的东西_mm_xor_si128,这是个什么玩意?

我们可以百度搜搜关键字,搜索后发现他其实是一个SSE2指令集中的xor异或指令, SSE2的一些常用指令集介绍

所以我们把代码改改,让他的可读性更强。

 for ( i = 0; i != 32; i += 16 )
{
szDest[i] = szDest[i] ^ xmmword_402190//异或
}
LOBYTE(v10) = v10 ^ 2;

那么接着还有个问题,szDest与xmmword_402190进行异或,那这个xmmword_402190是什么东西,首先猜测下他肯定是个数组,因为szDest[i]为数组元素,与xmmword_402190进行异或,理论上来说他应该也是个数组,并且大小为32。

我们在IDA中双击xmmword_402190,跳转到xmmword_402190的定义处,IDA默认显示成了大端模式,其实我们转成小端模式后内容应该是这样的

02020202020202020202020202020202h,这里的h代表是十六进制的意思,所以这里意思是16个byte类型值为:02。

或者更简单的方法,右键Data或按D键,改变数据类型。

显示类型为db,db就是定义一个byte字节的意思。这里显示为16个byte类型的2。

所以我们可以将代码更改的再具有可读性点。

#define byte unsigned char //byte就是无符号字符型
byte byteArry_02[16] = {2,2,2,2,2,2,2,2,2,2,2,2};for ( i = 0; i < 32; i += 16 )
{
szDest[i] = szDest[i] ^ byteArry_02[i%16]//异或
//i对16取余是因为szDest有32个元素,
//而byteArry_02只有16个元素,当i循环到16时候,继续从byteArry_02数组中的第0个元素开始异或
}

好了,最后下面还有一句代码,这里v10对2进行了异或

那我们来看看v10定义出在哪,可以看到v10在这里定义并且赋值了一个整型127

我们用python来计算下127^2是什么,计算后是125十六进制0x7d,他对应的Ascii码表应该是}.

POC代码编写

POC意思为概念验证(Proof of Concept),我们写个代码并且运行来验证下我们分析的结果.

我们可以把IDA中main函数代码直接复制过来,然后根据我们的分析修修改改。

poc.cpp

#include <stdio.h>
#include <string.h>int main(int argc, const char **argv, const char **envp)
{
//qmemcpy分析
char szDest[33]={0}; // [esp-28h] [ebp-34h] BYREF
memcpy(szDest,"........................",sizeof(szDest)); //加密算法分析
#define byte unsigned char //byte就是无符号字符型
byte byteArry_02[16] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
char v10 = 127;
for ( int i = 0; i < 32; i ++ )
{
szDest[i] = szDest[i] ^ byteArry_02[i%16];//异或
//i对16取余是因为szDest有32个元素,
//而byteArry_02只有16个元素,当i循环到16时候,继续从byteArry_02数组中的第0个元素开始异或
}
v10 = v10 ^ 2;//v10 = 127 ^ 2 = } //将}拼接上
strncat(szDest,(char*)&v10,1);
//flag
printf("-------------------------------------\n");
printf("%s\n",szDest);
printf("-------------------------------------\n");
}

得到flagflag{xxxxxxxxxxxxx}.

上一篇: 结束的NULL
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,071
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,549
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,397
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,174
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,809
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,889