Hetian lab Day 10:代码流程分析与key值获取

背景知识

常用汇编指令

1、mov
move指令用于将数据从源地址复制到目的地址,但是该数据不会从源位置移除,语法格式:

Mov <dest>,<source>

不能直接将数据从内存移动到某个段寄存器中,必须要用通用寄存器作为中间跳板

Mov eax,1234h
Mov cs, ax

2、add和sub
add用于将源与目的地相加,并将结果存在目的地中。sub命令用于将源从目的中减去,并将结果存在目的地中。
语法格式:

Add <dest>,<source>
Sub <dest>,<source>

实例:

add eax,51h
sub eax,51h

3、push与pop
压栈和弹栈
语法格式:

push <value>
pop <dest>

4、xor
xor命令用于按位逻辑异或运算,二进制位相同为0,不同为1。因此xor常用将寄存器或内存位置的值置为0.例如xor eax,eax,此操作会将eax置为0,比mov eax, 0更省内存,效率更高。
语法格式:

xor <dest>,<source>

跳转指令

5、jne\je\jz\jnz\jmp

jne\je\jz\jnz\jmp是根据eflag将程序的流程分支到另一个位置,

命令格式作用
jne <dest>不等于则跳转
jnz <dest>不等于0则跳转
je <dest>等于则跳转
jz <dest>等于0则跳转
jmp无条件跳转

6、call与ret
call命令用于调用函数,ret用在函数末尾处将控制流程返回到call之后的那条命令
语法格式:
call <dest>
ret
7、inc和dec
Inc和dec用于将目的操作数递增或递减,其作用类似a++a--
语法格式:

inc <dest>
dec <desy>

8、lea
lea命令用于将源操作数的实际地址加载到目的操作数中。
语法格式:

lea <dest>,<source>

9、int
int命令用于向处理器抛出一个系统中断信号,常用的中断信号是0x80,它用于向内核发送系统调用。

实验环境

Windows xp sp2系统

实验目的

本实验主要介绍了代码流程的分析与key值得获取,通过本实验的学习将会了解到静态文本分析的常用方法、策略,学会静态代码分析工具IDA的使用。

实验步骤

如果想要成为一名出色的恶意代码分析师,我们需要掌握很多反汇编的工具,一般的反汇编工具分为动态分析工具,例如著名的OllyDbg,而在静态分析方面,就属大名鼎鼎的IDA了,IDA以其强大的功能和众多的插件成为了很多逆向分析师的首选。IDA pro是商业产品,不过IDA也提供了评估试用版本,高级功能上可能有些限制,可以到https://www.hex-rays.com/products/ida/去下载。本实验使用的是IDA Demo 6.6 for MS Windows评估版本。
任何一个伟大的成就,往往有一个很不起眼的开始。通过本课程的学习,你将会掌握到:
1 学会IDA常用功能和快捷键
2 学会查看字符串。
3 学会利用函数窗口定位函数和重命名
4 学会使用交叉引用这个功能
5 利用上述技巧分析一个小的demo程序,并找到最终的key

步骤一:熟悉IDA界面和常用模块

在这里插入图片描述

步骤二:函数重命名和数值转化

1、函数重命名
  有时候IDA无法分析出程序子函数的功能,只能以sub_为前缀命名,这样不便于代码分析。IDA提供了函数重命名的方法,可以在分析完子程序之后对其进行重命名,这样有利于代码管理。
  在main函数中有条指令call sub_40100,sub表明这条语句为函数,双击该语句,按下n键,输入合适的函数名。
在这里插入图片描述
左侧的函数名也会发生变化。
2、数值转化
内存中存放的二进制数可以被解释成8进制、16进制、字符串、整型等,IDA不能完全智能判断数据类型,不过可以使用数值转化建。
如下图所示:
在这里插入图片描述
如果需要将0ch转化为10进制,可以通过右键选择,也可直接在0ch处按下h键,也可来回切换。
在这里插入图片描述
IDA中的右键是常用的功能键,点击右键之后一般就会有相应的快捷键提醒。

步骤三:分析程序执行流程与key值

  1. 点击main函数,main函数是程序的入口函数
  2. 查看程序的流程图:
    在这里插入图片描述
    由图上蓝色箭头可以看出,整个程序唯一的出口是loc_401055处。
    影响跳转的地方是jnz short_local401055,jnz是指不为0的时候跳转,根据上一条的test eax,eax来判断。eax是一个函数返回值存放的位置,将刚刚我们更改过的函数名改为check,接下来进入该函数
    在这里插入图片描述
    IDA中只能将函数中的局部变量命名为var_,将参数命名为arg_,所以mov ecx,[esp+arg_0]表示取出参数值并放入ecx中,然后xor eax,eax是将eax置为0,cmp是将函数调用的参数ecx和4D2H比较。接下来程序判断jnz,当值不相等是就会跳转到locret_401013处,程序返回。此处eax值为0,执行像一条指令,将eax置为1返回。
    check函数的作用就是检查参数的值,如果等于1234则返回1,否则返回0。

esc键返回到main函数查看参数含义。从最上方的注释“please input the key”,和下方ida提示的call scanf以及”%d”可以确认这是一个数字。

接下来mov指令将输入的参数存入到ecx中然后push到堆栈上。整个程序流程为:输入数字,检测是否为1234,如果不是则循环输入并检查,直到输入1234,key值就是1234.

分析与思考

1)IDA和OD相比,有什么缺点和优点,理解这些有助于你将来将两者结合使用。
动态调试,OD更为灵活和强大,而静态调试王者是IDA。

课后习题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值