逆向练习4

每日逆向的理解和积累。

汇编阅读练习

练习1

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

  • main函数

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

3.该程序并未开启canary保护机制。

练习2

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

  • main函数

  • f函数

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

3.补充:该程序并未开启canary保护机制。该程序中需要注意的是在ida中定义结构体具体操作如下图。

本程序中在ida中定义的结构体如下——

将定义好的结构体应用到程序中后——

  • main函数

  • f函数:当将鼠标置于[rbp+var_10]中时,按快捷键T报错如下图所示。

但通过程序分析我们可以看出[rbp+var_10]就是结构体的第一个成员变量int的地址。解决该报错并成功将其显示为结构体变量有以下两种解决方式。

  • 解决1——手动改变rename
  • 解决2如下描述;

invert the operand sign by pressing _ (underscore);
select the instruction;
press T. delta is 0x14, select the desired structure and its field.

实际操作及解决效果如下——

选中[rbp+var_10],并按快捷键T;
在弹出的窗口中将Offset delta设置为0x10如图;

最终效果如下图所示,此时可忽略rbp以及10h进行代码分析。

练习3

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

  • main函数

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

3.该程序开启了canary保护机制。补充知识:C/C++中基本数据类型所占内存大小

  • C中不同数据类型所占的字节大小,在不同的操作系统和编译器下,是不同的,一般主要说gcc下,32位或64位系统的如下图,红色部分是32和64位系统不同的。

练习4

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

  • main函数

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

3.该程序开启了canary保护机制。其中涉及到用户输入_isoc99_scanf以及文件处理_fopen_fclose。在这道题中,主要的难点在于通过对循环次数(0-5)进行如下图所示操作后加上结构体基址达到对结构体中各个成员变量的寻址操作。同时注意对于红框框起来的部分的后续思考和理解。

4.补充:对于红框框起来的部分的后续思考和理解——这里是优化后的除法操作,是一种通用的模式,imul edx表明是有符号操作数,sar eax,31用来取符号位,sub ecx,eax是根据符号位的具体值对原值进行调整。真正关键的移位信息在mov ecx,edx中,这里直接使用edx的值,因为edx中存放的是乘积的高32位,所以位移是32位,由此可计算出除数为:(2的32次方/55555556h)=2.999…,四舍五入得到最终除数为3。

练习5-1

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

  • main函数

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

3.该程序开启了canary保护机制。

练习5-2

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

  • main函数

  • input函数

  • output函数

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

3.该程序开启了canary保护机制。