实验4指导书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1实验简介
实验所属系列:恶意代码分析
实验对象:本科/专科信息安全专业
相关课程及专业:C语言,汇编语言
实验类别:实践实验类
2实验目的
通过该实验了解静态文本分析的常用方法和策略,掌握静态代码分析工具IDA常用的使用方法和分析思路
3预备知识
掌握常用的汇编知识和跳转指令
4实验环境
Windows系统
5实验步骤
如果想要成为一名出色的恶意代码分析师,我们需要掌握很多反汇编的工具,一般的反汇编工具分为动态分析工具,例如著名的OllyDbg,而在静态分析方面,就属大名鼎鼎的IDA了,IDA以其强大的功能和众多的插件成为了很多逆向分析师的首选。IDA pro是商业产品,不过IDA也提供了评估试用版本,高级功能上可能有些限制,可以到https:///products/ida/ 去下载。
在这里我们声明:我们以教学为目的,只使用其免费版本,支持大家购买正版使用。
任何一个伟大的成就,往往有一个很不起眼的开始。通过本课程的学习,你将会掌握到:
1学会IDA常用功能和快捷键
2学会查看字符串。
3学会利用函数窗口定位函数和重命名
4学会使用交叉引用这个功能
5 利用上述技巧分析一个小的demo程序,并找到最终的key
5.1实验任务一
任务描述:熟悉IDA的界面和常用模块
打开当前目录下的IDAPractice1.exe,将此文件拖拽至IDA下,开始分
析的界面如下
由图中可以看到,IDA分了好个模块。左侧部分叫做函数窗口,列出了程序中所有的函数。右侧较大的区域,是我们经常要用到的区域,系统默认显示的是整个程序的执行流程图,当然你可以使用空格键来切换,这时候就会显示全文本的汇编。左下角的图形窗口上,我们可以用鼠标移动,这时候右侧的流程图也会跟着变化。流程图上的各种箭头表示程序执行过程中的跳转。
1.在左侧的函数窗口上找到叫sub_401000的函数,双击,我们会看到右侧的窗口发生了变化,分析窗口跳转到了sub_401000的起始位置.一般的常用函数IDA会自动识别,所以在这些以sub_开头的函数,很可能就是程序员自己定义的,当然也不排除是ida没有识别的系统函数。
2.有时候程序里面的字符串对我们分析程序很有帮助,IDA有个模块可以将所有的字符串列出来。使用SHIFT+F12(或者在菜单中打开view-opensubview-strings),效果如下图所示
在这里,我们看到了“you got it \n”和“sorry,try again”这样的字符串,以“you got it\n”为例,双击,就会进入主窗口,我们会看到:
Dataxref:是数据引用的意思,你可以理解为程序中在哪里调用了这个字符串或数据,这里表示main函数中的local401055处调用了此字符串。我们再次双击,页面就跳转到:
这就是我们说到的交叉引用,0x401055处,用了push指令,而push到的值
刚好是我们这行字符串。
5.1.1练习
以下关于IDA,说法正确的是:【多选题】
【A】# 静态分析和动态分析相比,不需要执行代码,因此更安全
【B】# 因为IDA是静态文本分析工具,所以它不能执行动态调试
【C】#IDA的交叉引用只有数据引用,没有代码引用功能
【D】#IDA的缺点就是如果要分析的程序很大,则分析时间比较长
答案:AD
5.2实验任务二
这一阶段,我们要学习有关函数重命名和数值转化的知识。
1.函数重命名:有时候,ida无法分析出来程序的子函数是什么功能,只能以sub_前缀去命名,这为代码分析人员带来了很大的问题。好在ida为我们提供了函数重命名的方法,我们就可以再分析完子程序之后对其重命名,这样当你以后再次分析的时候就会一目了然。我们来演练一下:
在main函数中,有条指令call sub_401000,sub表名这是个函数,点击sub_401000,按下n键,输入你认为合适的函数名,如“do_something”.
这时候我们会看到左侧的函数窗口中相应的函数名也发生了变化.
2.数值转化:内存中存放的二进制数可以被解释成8进制,16进制,字符串型,整型等等。Ida不能完全智能的判断到底属于哪种类型,不过我们可以使用数值转化键。以下面图片为例:
我们需要将0ch换成10进制,可以通过右键选择,或者直接在0cH处摁下h键,可来回切换。
在ida中,右键是个很常用的功能键,打开右键之后,一般都会有相应的快捷键提醒。
5.2.1. 练习
以下关于IDA快捷键,说法错误的是:【单选题】
【A】#重命名快捷键n
【B】# 跳转到指令中所含的位置enter
【C】#流程图和文本视图切换space
【D】#设置断点F3
答案:D
5.3实验任务三
最后,让我们分析一下这个程序的执行流程,并且分析出最终的key值.
1.首先,在右侧函数窗口中选择main函数,这是该程序的入口函数。
2.查看整个程序的流程图:
由蓝色箭头表示跳转我们可以看到,整个程序大体是个死循环,唯一跳出的地方是loc_401055处,当然,我们通过”you got it\n”也可以看出来。
那么,影响跳转的地方是jnz short_local401055这条指令,jnz表示jmp not zero,也就是根据上一条test eax,eax的值来选择跳转。Testeax,eax这条指令在检查eax 是否为0.
我们知道,eax往往是一个函数的返回值存放的位置。所以,我们就对上面的call do_something比较感兴趣了。这时候,我们将do_something改为check.
接下来,我们进入这个check函数中去,在check上按回车键,即可进入:
我们来分析一下这些指令:
Ida中,智能的将函数中的局部变量命名为var_,将参数命名为arg_.所以,movecx,[esp+arg_0]表示的应该是取出参数的值到ecx中去。
然后xoreax,eax将eax置0.cmp是我们要关注的重点,这条指令,是将ecx(实质就是函数调用的参数)和4D2H比较.我们用刚才使用的方法将这个十六进制数转化为十进制数,右键,选择H,发现是1234.