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}.

cm1 逆向分析的更多相关文章

  1. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  2. 技术分享:逆向分析ATM分离器

    文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...

  3. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  4. TI(德州仪器) TMS320C674x逆向分析之一

    一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地 ...

  5. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  6. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

  7. 逆向分析一款国外Blackjack Card Counter软件并附上License生成脚本

    没有学过逆向,一时兴起,搞了一下这个小软件,名为“逆向分析”,其实过程非常简单,难登大雅之堂,就当段子看吧.首先介绍一下背景吧.这是一款国外的Blackjack也就是21点算牌软件,我从来不玩牌的,机 ...

  8. 010 Editor v8.0.1(32 - bit) 算法逆向分析、注册机编写

    010 Editor 的逆向分析整体算下来还是比较简单的,将程序拖入OD,通过字符串搜索定位到核心代码,经过分析,主要是如下图所示的两个关键函数,返回正确的值,才算是注册成功. 00409C9B 这个 ...

  9. [工控安全]西门子S7-400 PLC固件逆向分析(一)

    不算前言的前言:拖了这么久,才发现这个专题没有想象中的简单,学习的路径大致是Step7->S7comm->MC7 code->firmware,我会用尽量简短的语言把前两部分讲清楚, ...

随机推荐

  1. 【简单数据结构】二叉树的建立和递归遍历--洛谷 P1305

    题目描述 输入一串二叉树,用遍历前序打出. 输入格式 第一行为二叉树的节点数n.(n \leq 26n≤26) 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输出格式 前序 ...

  2. 【PHP数据结构】线性表?顺序表?链表?别再傻傻分不清楚

    遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门.今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总. 上文说过,物理结构是用于确定数据以何种方式存储的.其他的数据结构(树.图). ...

  3. 对象赋值在PHP中到底是不是引用?

    之前的文章中,我们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,直接就是引用赋值.那么到底真实情况是怎样呢? 之前变量赋值的文章 PHP的变量赋值 对象引用测试 在继续深入的学习PHP ...

  4. 如何解决SVN Upgrade working copy问题

    电脑还原系统后,安装了最新版本的SVN,发现原来在svn检出的文件夹出现了SVN Upgrade working copy,没有commit ,没有update. 在网上查询到:出现这个的原因是因为你 ...

  5. vue 熟悉项目结构 创建第一个自己的组件

    * vue开发环境搭建 * 项目入口文件 ./src/main.js // The Vue build version to load with the `import` command // (ru ...

  6. Selenium多浏览器并行测试

    如果需要同时在IE.firefox.chrome进行测试,可以使用grid. Selenium Grid是一个智能代理服务器,允许Selenium测试将命令路由到远程Web浏览器实例.其目的是提供一种 ...

  7. 微信小程序自动化测试

    使用官方工具 使用webview测试方法,当2019年被微信封禁 使用native定位

  8. GUI编程笔记

    GUI编程 告诉大家该怎么学? 这是什么? 它怎么玩? 该如何去我们平时运用? 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1.简介 GUi的核心技术:Sw ...

  9. 深入浅出WPF-06.Binding(绑定)01

    Binding(绑定) 先上图,再解释 针对这个图,我们先来说说什么是Binding. Binding就是一个桥梁,建立在数据和UI之间的桥梁.既然是数据驱动,那么我们就把数据称之为"源&q ...

  10. 【C++ Primer Plus】编程练习答案——第5章

    1 void ch5_1() { 2 using namespace std; 3 int small, big, sum{0}; 4 cout << "enter small ...