mirror of
https://github.com/nganhkhoa/CTF-All-In-One.git
synced 2024-12-25 11:41:16 +07:00
update reverse
This commit is contained in:
parent
3b6a654ccf
commit
e355aa523f
@ -9,6 +9,7 @@
|
|||||||
- [输入输出](#输入输出)
|
- [输入输出](#输入输出)
|
||||||
- [文件描述符](#文件描述符)
|
- [文件描述符](#文件描述符)
|
||||||
- [核心转储](#核心转储)
|
- [核心转储](#核心转储)
|
||||||
|
- [调用约定](#调用约定)
|
||||||
|
|
||||||
|
|
||||||
## 常用基础命令
|
## 常用基础命令
|
||||||
@ -285,3 +286,17 @@ Stack level 0, frame at 0x41414141:
|
|||||||
Locals at 0x41414141, Previous frame's sp is 0x41414141
|
Locals at 0x41414141, Previous frame's sp is 0x41414141
|
||||||
Cannot access memory at address 0x4141413d
|
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 参数,则后面的参数在栈上传递。
|
||||||
|
@ -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)
|
||||||
|
@ -1 +1,52 @@
|
|||||||
# 3.1 Reverse
|
# 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)
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
- [软件分析技术](http://sei.pku.edu.cn/~xiongyf04/SA/2016/main.htm)
|
- [软件分析技术](http://sei.pku.edu.cn/~xiongyf04/SA/2016/main.htm)
|
||||||
- [Compiler Design](http://www.cs.cmu.edu/~fp/courses/15411-f14/index.html)
|
- [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)
|
- [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/)
|
||||||
|
|
||||||
|
|
||||||
## 站点
|
## 站点
|
||||||
|
Loading…
Reference in New Issue
Block a user