diff --git a/doc/1.2_smart_ask.md b/doc/1.2_smart_ask.md index 18d88aa..dfe84df 100644 --- a/doc/1.2_smart_ask.md +++ b/doc/1.2_smart_ask.md @@ -1,2 +1,2 @@ -# 提问的智慧 +# 1.2 提问的智慧 https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way diff --git a/doc/1.3_linux_basic.md b/doc/1.3_linux_basic.md index 7b2e154..006ea80 100644 --- a/doc/1.3_linux_basic.md +++ b/doc/1.3_linux_basic.md @@ -1,4 +1,4 @@ -# Linux 基础 +# 1.3 Linux 基础 - [常用基础命令](#常用基础命令) - [根目录结构](#根目录结构) diff --git a/doc/1.4_web_basic.md b/doc/1.4_web_basic.md index 6a012d5..5e0bcf4 100644 --- a/doc/1.4_web_basic.md +++ b/doc/1.4_web_basic.md @@ -1 +1 @@ -# Web 安全基础 +# 1.4 Web 安全基础 diff --git a/doc/1.5.1_c_basic.md b/doc/1.5.1_c_basic.md index f3132c5..93a0afe 100644 --- a/doc/1.5.1_c_basic.md +++ b/doc/1.5.1_c_basic.md @@ -1,4 +1,4 @@ -# C 语言基础 +# 1.5.1 C 语言基础 - [从源代码到可执行文件](#从源代码到可执行文件) - [C 语言标准库](#c-语言标准库) diff --git a/doc/1.5.2_x86&x64&ARM.md b/doc/1.5.2_x86&x64&ARM.md index 7af53ff..0d21323 100644 --- a/doc/1.5.2_x86&x64&ARM.md +++ b/doc/1.5.2_x86&x64&ARM.md @@ -1,4 +1,4 @@ -# x86/x64/ARM 汇编基础 +# 1.5.2 x86/x64/ARM 汇编基础 - [x86](#x86) - [x64](#x64) diff --git a/doc/1.5.3_elf.md b/doc/1.5.3_elf.md index 7dbf997..0d51a6f 100644 --- a/doc/1.5.3_elf.md +++ b/doc/1.5.3_elf.md @@ -1,4 +1,4 @@ -# Linux ELF +# 1.5.3 Linux ELF - [一个实例](#一个实例) - [elfdemo.o](#elfdemoo) diff --git a/doc/1.5.4_pe.md b/doc/1.5.4_pe.md index 763124c..c0a6931 100644 --- a/doc/1.5.4_pe.md +++ b/doc/1.5.4_pe.md @@ -1 +1 @@ -# Windows PE +# 1.5.4 Windows PE diff --git a/doc/1.5.5_static_link.md b/doc/1.5.5_static_link.md index e72b579..f5f058d 100644 --- a/doc/1.5.5_static_link.md +++ b/doc/1.5.5_static_link.md @@ -1 +1 @@ -# 静态链接 +# 1.5.5 静态链接 diff --git a/doc/1.5.6_dynamic_link.md b/doc/1.5.6_dynamic_link.md index 2072e42..d8bc062 100644 --- a/doc/1.5.6_dynamic_link.md +++ b/doc/1.5.6_dynamic_link.md @@ -1,4 +1,4 @@ -# 动态链接 +# 1.5.6 动态链接 - [动态链接相关的环境变量](#动态链接相关的环境变量) @@ -17,7 +17,7 @@ void main() { scanf("%s", &str); if (!strcmp(passwd, str)) { printf("correct\n"); - return; + return; } printf("invalid\n"); } @@ -33,7 +33,7 @@ int strcmp(const char *s1, const char *s2) { } $ gcc -shared -o hack.so hack.c $ gcc ldpreload.c -$ ./a.out +$ ./a.out asdf invalid $ LD_PRELOAD="./hack.so" ./a.out diff --git a/doc/1.5.7_memory.md b/doc/1.5.7_memory.md index 504b06e..371da47 100644 --- a/doc/1.5.7_memory.md +++ b/doc/1.5.7_memory.md @@ -1,4 +1,4 @@ -# 内存管理 +# 1.5.7 内存管理 - [什么是内存](#什么是内存) - [栈与调用约定](#栈与调用约定) diff --git a/doc/1.5.8_glibc_malloc.md b/doc/1.5.8_glibc_malloc.md index 9d7748d..0ad0fea 100644 --- a/doc/1.5.8_glibc_malloc.md +++ b/doc/1.5.8_glibc_malloc.md @@ -1 +1 @@ -# glibc malloc +# 1.5.8 glibc malloc diff --git a/doc/1.5_reverse_basic.md b/doc/1.5_reverse_basic.md index 5837f5c..83ce10a 100644 --- a/doc/1.5_reverse_basic.md +++ b/doc/1.5_reverse_basic.md @@ -1,4 +1,4 @@ -# 逆向工程基础 +# 1.5 逆向工程基础 - [1.5.1 C 语言基础](1.5.1_c_basic.md) - [1.5.2 x86/x64/ARM 汇编基础](1.5.2_x86&x64&ARM.md) diff --git a/doc/1.6_crypto_basic.md b/doc/1.6_crypto_basic.md index 57dc05f..929d42a 100644 --- a/doc/1.6_crypto_basic.md +++ b/doc/1.6_crypto_basic.md @@ -1 +1 @@ -# 密码学基础 +# 1.6 密码学基础 diff --git a/doc/1.7_android_basic.md b/doc/1.7_android_basic.md index 2c724cc..c1f44ab 100644 --- a/doc/1.7_android_basic.md +++ b/doc/1.7_android_basic.md @@ -1 +1 @@ -# Android 安全基础 +# 1.7 Android 安全基础 diff --git a/doc/2.10_binwalk.md b/doc/2.10_binwalk.md index 333a2fa..d96ad4c 100644 --- a/doc/2.10_binwalk.md +++ b/doc/2.10_binwalk.md @@ -1 +1 @@ -# binwalk +# 2.10 binwalk diff --git a/doc/2.11_burpsuite.md b/doc/2.11_burpsuite.md index 2f24226..782d5cc 100644 --- a/doc/2.11_burpsuite.md +++ b/doc/2.11_burpsuite.md @@ -1 +1 @@ -# Burp Suite +# 2.11 Burp Suite diff --git a/doc/2.1_vm.md b/doc/2.1_vm.md index cbabe7d..e8457ab 100644 --- a/doc/2.1_vm.md +++ b/doc/2.1_vm.md @@ -1,4 +1,4 @@ -# 虚拟机环境 +# 2.1 虚拟机环境 - [物理机 Manjaro 17.02](#物理机-manjaro-1702) - [创建一个安全的环境](#创建一个安全的环境) diff --git a/doc/2.2_gdb&peda.md b/doc/2.2_gdb&peda.md index 3b7ca16..0e6cef2 100644 --- a/doc/2.2_gdb&peda.md +++ b/doc/2.2_gdb&peda.md @@ -1,4 +1,4 @@ -# 2.1 gdb 和 peda 调试器 +# 2.2 gdb 和 peda 调试器 - [gdb 的组成架构](#gdb-的组成架构) - [gdb 基本工作原理](#gdb-基本工作原理) diff --git a/doc/2.3_ollydbg.md b/doc/2.3_ollydbg.md index fb63d97..1f6f0d8 100644 --- a/doc/2.3_ollydbg.md +++ b/doc/2.3_ollydbg.md @@ -1 +1 @@ -# 2.2 OllyDbg 调试器 +# 2.3 OllyDbg 调试器 diff --git a/doc/2.4_windbg.md b/doc/2.4_windbg.md index 2b3ac77..dd21d9c 100644 --- a/doc/2.4_windbg.md +++ b/doc/2.4_windbg.md @@ -1 +1 @@ -# 2.3 WinDbg 调试器 +# 2.4 WinDbg 调试器 diff --git a/doc/2.5_radare2.md b/doc/2.5_radare2.md index 5edb279..1f351e1 100644 --- a/doc/2.5_radare2.md +++ b/doc/2.5_radare2.md @@ -1,4 +1,4 @@ -# 2.4 Radare2 +# 2.5 Radare2 - [简介](#简介) - [安装](#安装) @@ -926,3 +926,5 @@ $ r2 -c=H [filename] ## 更多资源 - [The radare2 book](https://www.gitbook.com/book/radare/radare2book) - [Radare2 intro](https://github.com/radare/radare2/blob/master/doc/intro.md) +- [A journey into Radare 2 – Part 1: Simple crackme](https://www.megabeets.net/a-journey-into-radare-2-part-1/) +- [A journey into Radare 2 – Part 2: Exploitation](https://www.megabeets.net/a-journey-into-radare-2-part-2/) diff --git a/doc/2.6_idapro.md b/doc/2.6_idapro.md index 4b3f541..ae0326d 100644 --- a/doc/2.6_idapro.md +++ b/doc/2.6_idapro.md @@ -1,4 +1,4 @@ -# 2.5 IDA Pro +# 2.6 IDA Pro - [常用插件](#常用插件) - [内存 dump 脚本](#内存-dump-脚本) diff --git a/doc/2.7_pwntools.md b/doc/2.7_pwntools.md index c5112e3..6579223 100644 --- a/doc/2.7_pwntools.md +++ b/doc/2.7_pwntools.md @@ -1,14 +1,17 @@ -# 2.6 Pwntools +# 2.7 Pwntools -* [安装](#安装) -* [使用pwntools](#使用pwntools) +- [安装](#安装) +- [模块简介](#模块简介) +- [使用 Pwntools](#使用-pwntools) +- [Pwntools 在 CTF 中的运用](#pwntools-在-ctf-中的运用) +- [参考资料](#参考资料) -pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exp脚本。包含了本地执行、远程连接读写、shellcode生成、ROP链的构建、ELF解析、符号泄露众多强大功能。 + +Pwntools 是一个 CTF 框架和漏洞利用开发库,用 Python 开发,由 rapid 设计,旨在让使用者简单快速的编写 exp 脚本。包含了本地执行、远程连接读写、shellcode 生成、ROP 链的构建、ELF 解析、符号泄露众多强大功能。 ## 安装 1. 安装binutils: - ```shell git clone https://github.com/Gallopsled/pwntools-binutils sudo apt-get install software-properties-common @@ -16,30 +19,198 @@ pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid sudo apt-get update sudo apt-get install binutils-arm-linux-gnu ``` - 2. 安装capstone: - ```shell git clone https://github.com/aquynh/capstone cd capstone make sudo make install ``` - 3. 安装pwntools: - ```shell sudo apt-get install libssl-dev sudo pip install pwntools ``` -测试安装是否成功: +如果你在使用 Arch Linux,则可以通过 AUR 直接安装,这个包目前是由我维护的,如果有什么问题,欢迎与我交流: +``` +$ yaourt -S python2-pwntools +或者 + +$ yaourt -S python2-pwntools-git +``` + +测试安装是否成功: ```python >>> import pwn ->>> pwn.asm("xor eax,eax") +>>> pwn.asm("xor eax,eax") '1\xc0' ``` -## 使用pwntools +## 模块简介 +Pwntools 分为两个模块,一个是 `pwn`,简单地使用 `from pwn import *` 即可将所有子模块和一些常用的系统库导入到当前命名空间中,是专门针对 CTF 比赛的;而另一个模块是 `pwnlib`,它更推荐你仅仅导入需要的子模块,常用于基于 pwntools 的开发。 + +下面是 pwnlib 的一些子模块(常用模块和函数加粗显示): +- `adb`:安卓调试桥 +- `args`:命令行魔法参数 +- **`asm`**:汇编和反汇编,支持 i386/i686/amd64/thumb 等 +- `constants`:对不同架构和操作系统的常量的快速访问 +- `config`:配置文件 +- `context`:设置运行时变量 +- **`dynelf`**:用于远程函数泄露 +- `encoders`:对 shellcode 进行编码 +- **`elf`**:用于操作 ELF 可执行文件和库 +- `flag`:提交 flag 到服务器 +- **`fmtstr`**:格式化字符串利用工具 +- **`gdb`**:与 gdb 配合使用 +- `libcdb`:libc 数据库 +- `log`:日志记录 +- **`memleak`**:用于内存泄露 +- `rop`:ROP 利用模块,包括 rop 和 srop +- `runner`:运行 shellcode +- **`shellcraft`**:shellcode 生成器 +- `term`:终端处理 +- `timeout`:超时处理 +- **`tubes`**:能与 sockets, processes, ssh 等进行连接 +- `ui`:与用户交互 +- `useragents`:useragent 字符串数据库 +- **`util`**:一些实用小工具 + + +## 使用 Pwntools +下面我们对常用模块和函数做详细的介绍。 + +#### tubes +在一次漏洞利用中,首先当然要与二进制文件或者目标服务器进行交互,这就要用到 tubes 模块。 + +主要函数在 `pwnlib.tubes.tube` 中实现,子模块只实现某管道特殊的地方。四种管道和相对应的子模块如下: +- `pwnlib.tubes.process`:进程 + - `>>> p = process('/bin/sh')` +- `pwnlib.tubes.serialtube`:串口 +- `pwnlib.tubes.sock`:套接字 + - `>>> r = remote('127.0.0.1', 1080)` + - `>>> l = listen(1080)` +- `pwnlib.tubes.ssh`:SSH + - `>>> s = ssh(host='example.com`, user='name', password='passwd')` + +`pwnlib.tubes.tube` 中的主要函数: +- `interactive()`:可同时读写管道,相当于回到 shell 模式进行交互,在取得 shell 之后调用 +- `recv(numb=1096, timeout=default)`:接收指定字节数的数据 +- `recvall()`:接收数据直到 EOF +- `recvline(keepends=True)`:接收一行,可选择是否保留行尾的 `\n` +- `recvrepeat(timeout=default)`:接收数据直到 EOF 或 timeout +- `recvuntil(delims, timeout=default)`:接收数据直到 delims 出现 +- `send(data)`:发送数据 +- `sendline(data)`:发送一行,默认在行尾加 `\n` +- `close()`:关闭管道 + +下面是一个例子,先使用 listen 开启一个本地的监听端口,然后使用 remote 开启一个套接字管道与之交互: +``` +In [1]: from pwn import * + +In [2]: l = listen() +[x] Trying to bind to 0.0.0.0 on port 0 +[x] Trying to bind to 0.0.0.0 on port 0: Trying 0.0.0.0 +[+] Trying to bind to 0.0.0.0 on port 0: Done +[x] Waiting for connections on 0.0.0.0:35117 + +In [3]: r = remote('localhost', l.lport) +[x] Opening connection to localhost on port 35117 +[x] Opening connection to localhost on port 35117: Trying ::1 +[x] Opening connection to localhost on port 35117: Trying 127.0.0.1 +[+] Opening connection to localhost on port 35117: Done + +[+] Waiting for connections on 0.0.0.0:35117: Got connection from 127.0.0.1 on port 36966 +In [4]: c = l.wait_for_connection() + +In [5]: r.send('hello\n') + +In [6]: c.recv() +Out[6]: 'hello\n' + +In [7]: r.send('hello\n') + +In [8]: c.recvline() +Out[8]: 'hello\n' + +In [9]: r.sendline('hello') + +In [10]: c.recv() +Out[10]: 'hello\n' + +In [11]: r.sendline('hello') + +In [12]: c.recvline() +Out[12]: 'hello\n' + +In [13]: r.sendline('hello') + +In [14]: c.recvline(keepends=False) +Out[14]: 'hello' + +In [15]: r.send('hello world') + +In [16]: c.recvuntil('hello') +Out[16]: 'hello' + +In [17]: c.recv() +Out[17]: ' world' + +In [18]: c.close() +[*] Closed connection to 127.0.0.1 port 36966 + +In [19]: r.close() +[*] Closed connection to localhost port 35117 +``` + +下面是一个与进程交互的例子: +``` +In [1]: p = process('/bin/sh') +[x] Starting local process '/bin/sh' +[+] Starting local process '/bin/sh': pid 32165 + +In [2]: p.sendline('sleep 3; echo hello world;') + +In [3]: p.recvline(timeout=1) +Out[3]: 'hello world\n' + +In [4]: p.sendline('sleep 3; echo hello world;') + +In [5]: p.recvline(timeout=1) +Out[5]: '' + +In [6]: p.recvline(timeout=5) +Out[6]: 'hello world\n' + +In [7]: p.interactive() +[*] Switching to interactive mode +whoami +firmy +^C[*] Interrupted + +In [8]: p.close() +[*] Stopped process '/bin/sh' (pid 32165) +``` + +#### asm + +#### dynelf + +#### elf + +#### fmtstr + +#### gdb + +#### memleak + +#### shellcraft + +#### util + +## Pwntools 在 CTF 中的运用 + +## 参考资料 +- [docs.pwntools.com](https://docs.pwntools.com/en/stable/index.html) diff --git a/doc/2.8_zio.md b/doc/2.8_zio.md index d57e34f..6bc355f 100644 --- a/doc/2.8_zio.md +++ b/doc/2.8_zio.md @@ -1 +1 @@ -# Zio +# 2.8 Zio diff --git a/doc/2.9_metasploit.md b/doc/2.9_metasploit.md index 6aa60c3..653cb45 100644 --- a/doc/2.9_metasploit.md +++ b/doc/2.9_metasploit.md @@ -1 +1 @@ -# MetaSploit +# 2.9 MetaSploit diff --git a/doc/3.3.1_format_string.md b/doc/3.3.1_format_string.md index 79939db..a7dcc0c 100644 --- a/doc/3.3.1_format_string.md +++ b/doc/3.3.1_format_string.md @@ -1,4 +1,4 @@ -# 格式化字符串漏洞 +# 3.3.1 格式化字符串漏洞 - [格式化输出函数和格式字符串](#格式化输出函数和格式字符串) - [格式化字符串漏洞基本原理](#格式化字符串漏洞基本原理) diff --git a/doc/3.3.2_integer_overflow.md b/doc/3.3.2_integer_overflow.md index e39375a..e95fe92 100644 --- a/doc/3.3.2_integer_overflow.md +++ b/doc/3.3.2_integer_overflow.md @@ -1,4 +1,4 @@ -# 整数溢出 +# 3.3.2 整数溢出 - [什么是整数溢出](#什么是整数溢出) - [整数溢出](#整数溢出) diff --git a/doc/3.3.3_stack_overflow.md b/doc/3.3.3_stack_overflow.md index 47d786e..04f32e8 100644 --- a/doc/3.3.3_stack_overflow.md +++ b/doc/3.3.3_stack_overflow.md @@ -1 +1 @@ -# 栈溢出 +# 3.3.3 栈溢出 diff --git a/doc/3.3.4_heap_overflow.md b/doc/3.3.4_heap_overflow.md index 96210f5..c204042 100644 --- a/doc/3.3.4_heap_overflow.md +++ b/doc/3.3.4_heap_overflow.md @@ -1 +1 @@ -# 堆溢出 +# 3.3.4 堆溢出 diff --git a/doc/4.2_Linux_terminal_tips.md b/doc/4.2_Linux_terminal_tips.md index f990216..6152996 100644 --- a/doc/4.2_Linux_terminal_tips.md +++ b/doc/4.2_Linux_terminal_tips.md @@ -1,4 +1,4 @@ -# Linux 命令行技巧 +# 4.2 Linux 命令行技巧 - [重定向输入字符](#重定向输入字符) - [从可执行文件中提取 shellcode](#从可执行文件中提取-shellcode) diff --git a/doc/4.3_gcc.md b/doc/4.3_gcc.md index 6e3c57e..e0174a5 100644 --- a/doc/4.3_gcc.md +++ b/doc/4.3_gcc.md @@ -1,4 +1,4 @@ -# GCC 堆栈保护技术 +# 4.3 GCC 堆栈保护技术 - [技术简介](#技术简介) - [编译参数](#编译参数) @@ -158,7 +158,7 @@ void main() { $ gcc -m32 -pie random.c -o open-pie $ readelf -h open-pie ELF Header: - Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 + Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) @@ -180,7 +180,7 @@ ELF Header: $ gcc -m32 -no-pie random.c -o close-pie $ readelf -h close-pie ELF Header: - Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 + Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) diff --git a/doc/4.4_dynelf.md b/doc/4.4_dynelf.md index e6bc05d..1d931be 100644 --- a/doc/4.4_dynelf.md +++ b/doc/4.4_dynelf.md @@ -1 +1 @@ -# 使用 DynELF 泄露函数地址 +# 4.4 使用 DynELF 泄露函数地址 diff --git a/doc/5.1_fuzz.md b/doc/5.1_fuzz.md index 8770079..fd92921 100644 --- a/doc/5.1_fuzz.md +++ b/doc/5.1_fuzz.md @@ -1,4 +1,4 @@ -# Fuzz 测试 +# 5.1 Fuzz 测试 - [AFL](#afl) diff --git a/doc/5.2_pin.md b/doc/5.2_pin.md index d63ad4f..d36d44d 100644 --- a/doc/5.2_pin.md +++ b/doc/5.2_pin.md @@ -1,4 +1,4 @@ -# Pin 动态二进制插桩 +# 5.2 Pin 动态二进制插桩 - [插桩技术](#插桩技术) - [Pin 简介](#pin-简介) diff --git a/doc/5.3_angr.md b/doc/5.3_angr.md index 142a3d1..132c78c 100644 --- a/doc/5.3_angr.md +++ b/doc/5.3_angr.md @@ -1,4 +1,4 @@ -# angr 二进制自动化分析 +# 5.3 angr 二进制自动化分析 angr是一个多架构的二进制分析平台,具备对二进制文件的动态符号执行能力和多种静态分析能力。 @@ -43,7 +43,7 @@ sudo python setup.py install 如果你在安装angr之后,进入python环境,在import之后有这样的报错: ```python -Python 2.7.12 (default, Nov 19 2016, 06:48:10) +Python 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import angr @@ -60,13 +60,13 @@ Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/capstone/__init__.py", line 6, in from . import arm, arm64, mips, ppc, sparc, systemz, x86, xcore ImportError: cannot import name arm ->>> +>>> ``` 在ipython环境中也许会有这样的报错: ```python -Python 2.7.12 (default, Nov 19 2016, 06:48:10) +Python 2.7.12 (default, Nov 19 2016, 06:48:10) Type "copyright", "credits" or "license" for more information. IPython 2.4.1 -- An enhanced Interactive Python. @@ -83,7 +83,7 @@ ImportError Traceback (most recent call last) /root/angr/angr/__init__.pyc in () 23 from .state_plugins.inspect import BP - 24 + 24 ---> 25 from .project import * 26 from .errors import * 27 #from . import surveyors @@ -104,7 +104,7 @@ ImportError Traceback (most recent call last) /root/angr/angr/analyses/reassembler.py in () 7 from itertools import count - 8 + 8 ----> 9 import capstone 10 import cffi 11 import cle @@ -113,7 +113,7 @@ ImportError Traceback (most recent call last) 4 if _python2: 5 range = xrange ----> 6 from . import arm, arm64, mips, ppc, sparc, systemz, x86, xcore - 7 + 7 8 __all__ = [ ImportError: cannot import name arm @@ -161,4 +161,3 @@ def print_flag(state): project.execute() ``` - diff --git a/doc/5.4_antidbg.md b/doc/5.4_antidbg.md index 118e2d1..9963148 100644 --- a/doc/5.4_antidbg.md +++ b/doc/5.4_antidbg.md @@ -1 +1 @@ -# 反调试技术 +# 5.4 反调试技术 diff --git a/doc/6.2_wintools.md b/doc/6.2_wintools.md index 4fecaa9..ffba6a2 100644 --- a/doc/6.2_wintools.md +++ b/doc/6.2_wintools.md @@ -1,4 +1,4 @@ -# 6.1.2 更多 Windows 工具 +# 6.2 更多 Windows 工具 - [010 Editor](#010-editor) - [DIE](#die) diff --git a/doc/6.3_books&blogs.md b/doc/6.3_books&blogs.md index c2d17cc..eb1f8a7 100644 --- a/doc/6.3_books&blogs.md +++ b/doc/6.3_books&blogs.md @@ -1,4 +1,4 @@ -# 更多资源 +# 6.3 更多资源 - [课程](#课程) - [站点](#站点) @@ -23,6 +23,7 @@ - [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/) +- [CS 252r: Advanced Topics in Programming Languages](http://web-static-aws.seas.harvard.edu/courses/cs252/2011sp/) ## 站点 diff --git a/doc/6.5_syscall.md b/doc/6.5_syscall.md index 7310078..1d0dd4d 100644 --- a/doc/6.5_syscall.md +++ b/doc/6.5_syscall.md @@ -1,2 +1,2 @@ -# Linux x86-64 系统调用表 +# 6.5 Linux x86-64 系统调用表 http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/