update reverse

This commit is contained in:
firmianay 2017-09-27 22:27:04 +08:00
parent 3b6a654ccf
commit e355aa523f
4 changed files with 77 additions and 0 deletions

View File

@ -9,6 +9,7 @@
- [输入输出](#输入输出)
- [文件描述符](#文件描述符)
- [核心转储](#核心转储)
- [调用约定](#调用约定)
## 常用基础命令
@ -285,3 +286,17 @@ Stack level 0, frame at 0x41414141:
Locals at 0x41414141, Previous frame's sp is 0x41414141
Cannot access memory at address 0x4141413d
```
## 调用约定
函数调用约定是对函数调用时如何传递参数的一种约定。关于它的约定有许多种,下面我们分别从内核接口和用户接口介绍 32 位和 64 位 Linux 的调用约定。
#### 内核接口
**x86-32 系统调用约定**Linux 系统调用使用寄存器传递参数。`eax` 为 syscall_number`ebx`、`ecx`、`edx`、`esi`、`ebp` 用于将 6 个参数传递给系统调用。返回值保存在 `eax` 中。所有其他寄存器(包括 EFLAGS都保留在 `int 0x80` 中。
**x86-64 系统调用约定**:内核接口使用的寄存器有:`rdi`、`rsi`、`rdx`、`r10`、`r8`、`r9`。系统调用通过 `syscall` 指令完成。除了 `rcx`、`r11` 和 `rax`,其他的寄存器都被保留。系统调用的编号必须在寄存器 `rax` 中传递。系统调用的参数限制为 6 个,不直接从堆栈上传递任何参数。返回时,`rax` 中包含了系统调用的结果。而且只有 INTEGER 或者 MEMORY 类型的值才会被传递给内核。
#### 用户接口
**x86-32 函数调用约定**:参数通过栈进行传递。最后一个参数第一个被放入栈中,直到所有的参数都放置完毕,然后执行 call 指令。这也是 Linux 上 C 语言函数的方式。
**x86-64 函数调用约定**x86-64 下通过寄存器传递参数,这样做比通过栈有更高的效率。它避免了内存中参数的存取和额外的指令。根据参数类型的不同,会使用寄存器或传参方式。如果参数的类型是 MEMORY则在栈上传递参数。如果类型是 INTEGER则顺序使用 `rdi`、`rsi`、`rdx`、`rcx`、`r8` 和 `r9`。所以如果有多于 6 个的 INTEGER 参数,则后面的参数在栈上传递。

View File

@ -1 +1,10 @@
# 逆向工程基础
- [1.5.1 C 语言基础](1.5.1_c_basic.md)
- [1.5.2 x86/x64/ARM 汇编基础](1.5.2_x86&x64&ARM.md)
- [1.5.3 Linux ELF](1.5.3_elf.md)
- [1.5.4 Windows PE](1.5.4_pe.md)
- [1.5.5 静态链接](1.5.5_static_link.md)
- [1.5.6 动态链接](1.5.6_dynamic_link.md)
- [1.5.7 内存管理](1.5.7_memory.md)
- [1.5.8 glibc malloc](1.5.8_glibc_malloc.md)

View File

@ -1 +1,52 @@
# 3.1 Reverse
- [怎样学习逆向工程](#怎样学习逆向工程)
## 怎样学习逆向工程
逆向工程一直被视为一种充满乐趣和带有神秘色彩的东西,逆向工程师看起来就像是在密密麻麻的指令中寻找宝藏的人,他们绕开层层的限制和保护,发现程序中的的错误、漏洞或者是被加密算法掩盖的数据结构。这里我会比较概括地介绍怎样去学习逆向工程。
首先应该注意两个最关键的事情:
- 逆向工程需要大量的练习。一个人不能只通过阅读教程来学习逆向工程,教程可能会教你一些技巧,工具的使用和一般的工作流程,但它们只应该作为补充,而不是学习过程的核心。
- 逆向工程需要大量的时间。在逆向工程中,几个甚至几十个小时的工作是很正常的,请不要吝啬你的时间。
对一个对象的逆向工程包含了三个意思:
- 静态分析:分析二进制文件反编译后的结果。
- 动态分析:对正在运行的进程使用调试器。
- 行为分析:使用更高级的工具获得所选进程的行为。
通常我建议在进行一系列逆向工程挑战(如 crackme 和 CTF的时候混合使用上面的三种分析方法。
我会在下面的部分分别详细介绍三种分析方法,并列出刚开始是需要熟悉的资料和工具。
#### 静态分析
#### 动态分析
#### 行为分析
行为分析与给定目标与环境交互的方式有关(主要是操作系统以及文件、套接字、管道、寄存器等各种资源)。
我建议你从下面的工具开始:
- [Process Monitor](https://docs.microsoft.com/en-us/sysinternals/downloads/procmon)是一个免费的 Windows 应用程序,可以让你监视系统范围内的访问,如文件、寄存器、网络以及进程相关的事件等。
- [Process Hacker](http://processhacker.sourceforge.net/)和[Process Explorer](https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer)是可替代 Windows 任务管理器的工具,它们都提供了有关运行中程序的更多详细信息。
- [Wireshark](https://www.wireshark.org/)是一个十分方便的跨平台的网络嗅探器。
- [strace](https://linux.die.net/man/1/strace)是一个用于监视给定进程系统调用的 Linux 工具。
- [ltrace](https://linux.die.net/man/1/ltrace)与 strace 类似,但它用于监视动态库调用。
#### 其他有用的资源
正如我一开始提到的,这里给出的只是学习之初的建议,它们在逆向工程领域中只是冰山一角。下面是一些学习资料。
书籍:
- Reverse Engineering for Beginners (2017) by Dennis Yurichev (CC BY-SA 4.0, so yes, it's free and open)
- Practical Malware Analysis (2012) by Michael Sikorski and Andrew Honig
- Practical Reverse Engineering (2014) by Bruce Dang, Alexandre Gazet, Elias Bachaalany, Sebastien Josse
- Hacker Disassembling Uncovered (2003) by Kris Kaspersky
- Reversing: Secrets of Reverse Engineering (2005) by Eldad Eilam
其他资源:
- [Tuts 4 You](https://tuts4you.com/)
- [/r/ReverseEngineering](https://www.reddit.com/r/ReverseEngineering/)
- [Reverse Engineering at StackExchange](https://reverseengineering.stackexchange.com/)
- [PE Format](https://msdn.microsoft.com/en-us/library/windows/desktop/ms680547(v=vs.85).aspx)
- [Executable and Linkable Format (ELF)](http://www.skyfree.org/linux/references/ELF_Format.pdf)
- [Ange Albertini's executable format posters](https://github.com/corkami/pics/tree/master/binary)

View File

@ -21,6 +21,8 @@
- [软件分析技术](http://sei.pku.edu.cn/~xiongyf04/SA/2016/main.htm)
- [Compiler Design](http://www.cs.cmu.edu/~fp/courses/15411-f14/index.html)
- [Optimizing Compilers](http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15745-s14/www/index.html)
- [Principles of Program Analysis](http://www.imm.dtu.dk/~hrni/PPA/ppasup2004.html)
- [Static Program Analysis](https://cs.au.dk/~amoeller/spa/)
## 站点