逆向练习9

每日逆向的理解和积累。

汇编阅读练习

练习1

汇编代码及解释——


C的release版本

  • main函数




C的debug版本

  • main函数(其余4个子函数略)

经过到目前为止的对比分析,可以比较确定的是,release版的程序会尽可能的将不涉及到用户输入的子函数集成到main函数中,不涉及到用户输入的变量都会采用寄存器的形式进行存储和访问。而有关用户输入的变量和子函数,都会尽可能的维持原样。


对应源码——

问题描述——C语言数制转换:给定一个 M 进制的数 x,实现对 x 向任意的一个非 M 进制的数的转换。

具体编程实现如下——

练习2

汇编代码及解释——


C的release版本

  • main函数


C的debug版本

  • main函数

对于程序中定义了但是没有使用的常量,release版的程序会直接丢弃这些常量。


对应源码——

问题描述——一道题目,玩转C语言指针数组和指向指针的指针。

练习3

汇编代码及解释——


C的release版本

  • main函数



C的debug版本

  • main函数


对应源码——

问题描述——C语言写的简单的定时关机程序:写一个定时关机的小程序,可以立即关闭计算机,也可以一段时间后关闭计算机。这里主要考察system()命令。

参考资料

What does “nop dword ptr 【rax+rax】” x64 assembly instruction do?

练习4

汇编代码及解释——


C的release版本

  • main函数


C的debug版本

  • main函数


对应源码——

问题描述——C语言动态数组的实现:数组长度随数组元素改变,不会溢出,不会浪费资源。我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源。请实现一个简单的动态数组,能够随时改变大小,不会溢出,也不会浪费内存空间。

练习5

汇编代码及解释——


C的release版本

  • main函数



C的debug版本

  • main函数


对应源码——

问题描述——C语言实现的猜拳游戏(剪子锤子布),让你与电脑对决。

参考资料

有符号十六进制转换为十进制
原码,反码,补码相互转换在线计算器