逆向练习1

关于reverse过程中的一些汇编代码片段的理解和积累。

一、片段

  1. 源码及对应汇编代码——

理解:ds:notelist[eax4]和ds:notelist[edx4]分别代指notelist[idx]->printnote和notelist{idx}(这个主要指note的具体内容),最后将后者作为参数入栈,调用前者执行。

  1. 一个整数每次执行移位运算中的左运算n次,相当于这个整数乘以2的n次方;一个整数每次执行移位运算中的右运算n次,相当于这个整数除以2的n次方;

二、汇编阅读练习

练习1

1.汇编代码及解释如下:

  • main函数

  • return_test函数

2.对应c语言源码如下:

练习2

1.汇编代码及解释如下:

  • main函数

2.对应c语言源码如下:

3.补充:该程序的目的是求一个数,它加上100后是一个完全平方数,再加上168又是一个完全平方数。程序分析如下图——

分析时将除了下图所示的两处计算之外的其他判断和运算均分析正确,

这两处分析的运算逻辑是正确的,但缺少简化,实际上这个右移31位再循环右移一位是实现了/2的操作,该运算过程可以简化为(i + j) / 2(i - j) / 2。(汇编中的除法运算有很大一部分都是通过移位来实现的。)

练习3

1.汇编代码及解释如下:

  • main函数

函数中的主要逻辑是由嵌套的if-else判断组成的,根据每个分支的相同运算形式,我们可以联想到用户输入本金,计算利润的操作。

2.对应c语言源码如下:

3.补充1:在分析过程中最大的问题就是对于如下图所示的各个常量的具体数值的不清楚,也就是不了解float/double类型浮点数在内存中的表现形式,故无法计算出对应具体值,在对照源码分析后才得出其对应值如下图——

而float/double类型浮点数在内存中的表现形式如下图:

自己分析的时候最开始并没有成功分析出对应浮点数据的值,直到注意到上图中红线所示处,也即是注意其真实尾数的位数会占用一位阶码的最后一位。

参考链接:

http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html
https://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html
http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

4.补充2:对于分析过程中如下图所示的字符串常量的含义不理解,也无法将其转换为对应的字符或字符串——

这种情况可能是因为是中文字符,有如下2种解决方式。
1)直接在ida的hex窗口中查看该部分内存——

2)将其右键设置为”Undefine”,然后再右键即可看到其中文字符串(快捷键“A”)——

练习4

1.汇编代码及解释如下:

  • main函数

2.对应c语言源码如下:

3.有时候分析时没必要将每一句汇编语句都理清楚,可以根据程序中其余信息(如字符串等)推断程序中部分运算的功能,如本练习中就是根据如图字符串结合整体的分析判断程序中间那一段移位乘法操作的功能的——

此段运算操作分析起来较复杂,实际分析过程中可以考虑动态调试,或者假设[rbp+var_14]的值为某个具体值,然后带进去算。

练习5

1.汇编代码及解释如下:

  • main函数

2.对应c语言源码如下:

3.由于变量[rbp-0xc]占用的是(rbp-C)~(rbp-8)之间这4字节的内存空间,故可猜测其类型为int型变量;而变量[rbp-0xD]占用的是(rbp-D)~(rbp-c)之间这1字节的内存空间,故可猜测其类型为char型——