翻译自:https://medium.com/bugbountywriteup/bolo-reverse-engineering-part-1-basic-programming-concepts-f88b233c63b7
在逆向工程学习过程我发现自己想要一个简单的指南,以便在浏览汇编代码时查找内容。 虽然我非常相信阅读源代码和手册来获取信息,但我完全理解想在一篇文章里面拥有简洁,易于理解,信息量大的代码愿望。 “逆向工程”系列正是如此! 在本系列文章中,我将向您展示逆向工程代码需要注意的事项。本系列文章将使初学者逆向工程师更容易掌握许多不同的概念在理想的情况下!
在本文中,您将看到C ++代码和汇编代码的屏幕截图以及有关你看到的这些截图为什么是你看到的这样的一些解释。此外,本系列文章不会介绍汇编的基础知识,它只会提供模式和反编译代码,以便您可以大致了解要查找的内容/如何解释汇编代码。
在本文中,我们将介绍:
请注意:本教程是在Microsoft Visual Studio 2015中使用visual C ++制作的(我知道,过时的版本)。一些汇编代码(即带有cin的用户输入)将反映出这一点。此外,我使用IDA Pro作为我的反汇编工具。
编程时变量非常重要,这里我们可以看到一些重要的变量:
a string #字符串变量
an int # 整型变量
a Boolean #布尔型变量
a char #字符型变量
a double #双精度变量
a float #单精度变量
a char array #字符型数组
请注意:在C ++中,'string'不是原始变量,但我认为无论如何都很重要。
现在,让我们来看看程序集:
初始化变量
在这里,我们可以看到IDA如何表示变量的空间分配。如您所见,我们在实际初始化每个变量之前为每个变量分配空间
一旦分配了空间,我们将我们想要设置每个变量的值移动到我们为所述变量分配的空间中。虽然这里初始化了大部分变量,但下面你会看到C ++字符串的启动。
如您所见,初始化字符串需要调用内置函数进行。
前言信息:在本节中,我将讨论推入堆栈并用作printf函数参数的项目。函数参数的概念将在本文后面更详细地解释。
虽然本教程是用Visual C ++构建的,但我选择使用printf而不是cout来输出
现在,我们来看看程序集:
首先,字符串文字:
如您所见,字符串文字被压入堆栈作为printf函数的参数被调用。
现在,我们来看看其中一个变量输出:
如您所见,首先将变量intvar移入EAX寄存器,然后将其用指示整数输出的字符串文字‘’%i’一起送入堆栈中。然后将这些变量从堆栈中取出,并作为在调用printf函数时的参数。
在本节中,我们将讨论如下函数:
谢谢!
希望本文能够让您对基本编程概念在汇编中的表示方式有所了解。请密切关注本系列的下一部分,逆向工程 - 第2部分(高级编程概念)!