From bb403d3303903c3a7c69ba52ecde94b5a23299c6 Mon Sep 17 00:00:00 2001 From: firmianay Date: Wed, 16 Aug 2017 21:49:30 +0800 Subject: [PATCH] fix --- doc/1.5.1_c_basic.md | 19 +++++++++++++++++++ doc/1.5.7_memory.md | 6 +++--- doc/6.4_writeup.md | 4 ++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/doc/1.5.1_c_basic.md b/doc/1.5.1_c_basic.md index ab1b2f7..67245df 100644 --- a/doc/1.5.1_c_basic.md +++ b/doc/1.5.1_c_basic.md @@ -1,6 +1,7 @@ # C 语言基础 - [从源代码到可执行文件](#从源代码到可执行文件) +- [C 语言标准库](#c-语言标准库) - [整数表示](#整数表示) @@ -56,6 +57,24 @@ $gcc -c hello.c -o hello.o 目标文件需要链接一大堆文件才能得到最终的可执行文件。链接过程主要包括地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定向(Relocation)等。 +## C 语言标准库 +C 运行库(CRT)是一套庞大的代码库,以支撑程序能够正常地运行。其中 C 语言标准库占据了最主要地位。 + +常用的标准库文件头: +- 标准输入输出(stdio.h) +- 字符操作(ctype.h) +- 字符串操作(string.h) +- 数学函数(math.h) +- 实用程序库(stdlib.h) +- 时间/日期(time.h) +- 断言(assert.h) +- 各种类型上的常数(limits.h & float.h) +- 变长参数(stdarg.h) +- 非局部跳转(setjmp.h) + +glibc 即 GNU C Library,是为 GNU 操作系统开发的一个 C 标准库。glibc 主要由两部分组成,一部分是头文件,位于 `/usr/include`;另一部分是库的二进制文件。二进制文件部分主要是 C 语言标准库,有动态和静态两个版本,动态版本位于 `/lib/libc.so.6`,静态版本位于 `/usr/lib/libc.a`。 + + ## 整数表示 默认情况下,C 语言中的数字是有符号数,下面我们声明一个有符号整数和无符号整数: ```c diff --git a/doc/1.5.7_memory.md b/doc/1.5.7_memory.md index 0d9690b..504b06e 100644 --- a/doc/1.5.7_memory.md +++ b/doc/1.5.7_memory.md @@ -137,8 +137,8 @@ End of assembler dump. gdb-peda$ disassemble _start Dump of assembler code for function _start: 0x00000400 <+0>: xor ebp,ebp ;清零 ebp,表示下面的 main() 函数栈帧中 ebp 保存的上一级 ebp 为 0x00000000 - 0x00000402 <+2>: pop esi ;弹栈设置 esi - 0x00000403 <+3>: mov ecx,esp ;暂时保存当前的 esp + 0x00000402 <+2>: pop esi ;将 argc 存入 esi + 0x00000403 <+3>: mov ecx,esp ;将栈顶地址(argv 和 env 数组的其实地址)传给 ecx 0x00000405 <+5>: and esp,0xfffffff0 ;栈 16 字节对齐 0x00000408 <+8>: push eax ;eax、esp、edx 入栈 0x00000409 <+9>: push esp @@ -152,7 +152,7 @@ Dump of assembler code for function _start: 0x00000424 <+36>: push ecx ;ecx、esi 入栈保存 0x00000425 <+37>: push esi 0x00000426 <+38>: push DWORD PTR [ebx-0x8] ;调用 main() 函数之前保存返回地址,其实就是保存 main() 函数的入口地址 - 0x0000042c <+44>: call 0x3e0 <__libc_start_main@plt> ;call 指令调用 main() 函数 + 0x0000042c <+44>: call 0x3e0 <__libc_start_main@plt> ;call 指令调用 __libc_start_main 函数 0x00000431 <+49>: hlt ;hlt 指令使程序停止运行,处理器进入暂停状态,不执行任何操作,不影响标志。当 RESET 线上有复位信号、CPU 响应非屏蔽终端、CPU 响应可屏蔽终端 3 种情况之一时,CPU 脱离暂停状态,执行下一条指令 0x00000432 <+50>: mov ebx,DWORD PTR [esp] ;esp 强制转换为双字数据后保存到 ebx 0x00000435 <+53>: ret ;返回,相当于 pop eip; diff --git a/doc/6.4_writeup.md b/doc/6.4_writeup.md index d8dd54f..12f0650 100644 --- a/doc/6.4_writeup.md +++ b/doc/6.4_writeup.md @@ -39,7 +39,7 @@ - [4.3 GCC 堆栈保护技术]() - [五、高级篇]() - [5.1 Fuzz 测试]() - - [5.2 Pin 动态二进制插桩](#53-angr-二进制自动化分析) + - [5.2 Pin 动态二进制插桩](#52-Pin-动态二进制插桩) - [5.3 angr 二进制自动化分析]() - [5.4 反调试技术]() - [六、附录]() @@ -47,7 +47,7 @@ - [6.2 更多 Windows 工具]() -## 5.3 angr 二进制自动化分析 +## 5.2 Pin 动态二进制插桩 #### Baleful - picoCTF 2014 #### Reverse 400 - Hack You 2014