
0x00前言
0x01静态分析
本次要分析的代码段位于0x80495C0,如图是IDA还原出的关键伪C代码
1.png (24.04 KB, 下载次数: 0)
保存到相册
2018-2-20 17:27 上传
这次我们要分析的就是disasm函数,在分析这个函数之前,我们需要先分析一下传入的参数v4,图中已高亮显示,很容易看出v4可能是一个长度为4的数组(下标为0的变量存放一个数组的首地址,这个数组是一个指令集,其他3个我们在动态调试中说明)
disasm函数里面是一个有大量分支的switch分支语句,这里截取部分
28.png (41.17 KB, 下载次数: 0)
保存到相册
2018-2-20 22:03 上传
0x02动态分析
在这里我是用的是Ubuntu虚拟机(该文件是ELF程序)+IDA,这里输入以0123456789012345为例,直接断点到0x0804964A(call disasm)
2.png (14.57 KB, 下载次数: 0)
保存到相册
2018-2-20 17:48 上传
3.png (18.49 KB, 下载次数: 0)
保存到相册
2018-2-20 17:50 上传
此时传入的参数位于栈顶
4.png (18.28 KB, 下载次数: 0)
保存到相册
2018-2-20 17:53 上传
然后在Hex View中查看内存
5.png (12.33 KB, 下载次数: 0)
保存到相册
2018-2-20 17:56 上传
选中的部分就是v4[0],紧跟的三个不为零的数据分别是v4[1],v4[2],v4[3]
v4[1]存放的地址指向(其实也是一个数组)
7.png (16.52 KB, 下载次数: 0)
保存到相册
2018-2-20 18:06 上传
v4[2]存放的地址指向(虽然现在指向数组尾,但是后面会发现这是一个数据临时存放区)
8.png (14.94 KB, 下载次数: 0)
保存到相册
2018-2-20 18:09 上传
v4[3]存放的地址指向(待处理的数据)
9.png (36.32 KB, 下载次数: 0)
保存到相册

2018-2-20 18:11 上传
v4与其解析为一个数组,不如解析为一个结构体来的简洁明了
[C] 纯文本查看 复制代码
struct code_vm{ unsigned int *code_ip; unsigned int *array; unsigned int temp; unsigned int *input;}code_vm;
这时我们把v4转换为code_vm,其中code_ip保存指令集的游标,array保存一个数组(保存一些数据)的头地址,temp保存临时数据,input指向待处理的数据头
了解了这些内容,我们开始分析disasm函数
10.png (19 KB, 下载次数: 0)
保存到相册
2018-2-20 20:59 上传
11.png (19.06 KB, 下载次数: 0)
保存到相册
2018-2-20 20:59 上传
进入后,获取code_ip游标处的数据(寄存器ebx即为code_ip)
此时读取1个字节后保存到eax中,然后再减去0xC(十进制12),最后我们得到0x64,然后又与0xF3(0xFF-0xC)比较,这个比较并没有什么重要作用,这里我们可以忽略
12.png (18.5 KB, 下载次数: 0)
保存到相册
2018-2-20 21:08 上传
向下单步跟进开始跳转
13.png (29.03 KB, 下载次数: 0)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-87176-1.html
不用大陆动手
同时也说明12海里主权我们已经坐实了