48 lines
3.3 KiB
Markdown
48 lines
3.3 KiB
Markdown
# 二进制安全
|
||
|
||
## 简介
|
||
|
||
二进制安全在 CTF 中常分为 pwn 和 reverse 两大方向。
|
||
|
||
pwn 主要研究漏洞的挖掘及其利用的手段,并利用漏洞攻击目标取得目标机器的权限。
|
||
|
||
reverse 主要研究软件破解,软件加固,计算机病毒等。
|
||
|
||
现实场景下,这两种方向通常界限比较模糊,统称的二进制安全主要研究漏洞挖掘,漏洞利用,软件加固,计算机病毒,游戏安全等。
|
||
|
||
## 入门材料
|
||
> HGAME Mini 2022 Reverse Pwn 入门材料
|
||
> Reverse:https://www.notion.so/b92ca2bfaacf4e7c873882dff9dbf649
|
||
> Pwn:https://ek1ng.oss-cn-hangzhou.aliyuncs.com/HGAME%20Mini%202022%20Pwn%E5%85%A5%E9%97%A8%E6%8C%87%E5%8C%97.pdf
|
||
|
||
## 学习二进制安全需要具备哪些基础?
|
||
|
||
- 扎实的 C 语言基础,目前现有的各种二进制分析工具通常都会把汇编代码重新反编译为 C 语言程序。
|
||
- 适当的软件开发经验,安全的基础是开发。
|
||
- 扎实的汇编语言基础,如果你了解过编译的过程,就会知道现在的编译型语言,如 C,C++,go,rust 等,他们的编译产物通常都是对应架构的二进制程序,而二进制程序是可以直接反汇编成汇编代码的,换句话说,理论上能看懂汇编,就能看懂一切计算机程序。
|
||
|
||
## 为了打好基础,我应该怎么学?
|
||
|
||
- C 语言推荐阅读《C Primer Plus》,C 语言领域的圣经。二进制对 C 语言的最低要求:熟练地使用链表完成约瑟夫环问题。
|
||
- x86 汇编语言推荐阅读王爽的《汇编语言》,在本文编辑时已经出到了第四版。x86 是目前最常用的 CPU 架构之一,目前基本上所有的电脑,服务器都采用的 x86 架构。因此在初期的二进制学习中,学习 x86 汇编语言是没有什么问题的。x86 汇编语言历史比较悠久,从 Intel 公司的第一代处理器 8086 采用的 16 位 x86 汇编语言开始,已经逐步发展到现在的 32 位/64 位。王爽的《汇编语言》讲的就是 16 位 x86 汇编语言。可能有人会问,现在学 16 位汇编语言还有什么用吗?其实 x86 的基础命令,对汇编语言来说只是寄存器的命名有所不同,寄存器的宽度也由 16 位升到 32 位再到 64 位而已。比如在 16 位汇编中,加法命令是 `add ax,bx`(意思是 ax=ax+bx,ax 和 bx 都是 16bit 的寄存器),而到了 32 位汇编中是 `add eax,ebx`,64 位汇编中是 `add rax,rbx`。虽然这些语句翻译成字节码是有区别的,但对于汇编语言来说差别并不大,因此由 16 位汇编入门,简单易上手,后面扩展到 32/64 位也很容易,是非常合适的。
|
||
- Python 的基本语法,Python 之所以没有作为“基础”,是因为在二进制安全中,Python 由于其简单,开发周期短的特性,往往充当一个锦上添花的工具的角色,比如在做逆向工程领域的研究时,使用 Python 来编写一些加解密脚本要比使用 C 语言快速。感受一下:
|
||
|
||
```c
|
||
#include<stdio.h>
|
||
#include<string.h>
|
||
int main()
|
||
{
|
||
char ch[]="hello world";
|
||
for(int i=0;i<strlen(ch);i++)
|
||
{
|
||
putchar(ch[i]^0x33);
|
||
}
|
||
}
|
||
```
|
||
|
||
```python
|
||
print("".join(chr(ord(i)^0x33) for i in "hello world"))
|
||
```
|
||
|
||
但从方便学习的角度考虑,学习 Python 还是非常有好处的,因此学有余力的同学可以多加学习一下这一强大的工具。
|