更新时间:2020-10-30 17:57:35
封面
版权信息
译者序
序
前言
致谢
第1章 夹缝求生
1.1 衡量危险
1.1.1 损失的现状
1.1.2 威胁的来源
1.1.3 软件安全
1.2 安全概念
1.2.1 安全策略
1.2.2 安全缺陷
1.2.3 漏洞
1.2.4 漏洞利用
1.2.5 缓解措施
1.3 C和C++
1.3.1 C和C++简史
1.3.2 C存在的问题
1.3.3 遗留代码
1.3.4 其他语言
1.4 开发平台
1.4.1 操作系统
1.4.2 编译器
1.5 小结
1.6 阅读材料
第2章 字符串
2.1 字符串
2.1.1 字符串数据类型
2.1.2 UTF-8
2.1.3 宽字符串
2.1.4 字符串字面值
2.1.5 C++中的字符串
2.1.6 字符类型
2.1.7 计算字符串大小
2.2 常见的字符串操作错误
2.2.1 无界字符串复制
2.2.2 差一错误
2.2.3 空字符结尾错误
2.2.4 字符串截断
2.2.5 与函数无关的字符串错误
2.3 字符串漏洞及其利用
2.3.1 被污染的数据
2.3.2 IsPasswordOK()的安全缺陷
2.3.3 缓冲区溢出
2.3.4 进程内存组织
2.3.5 栈管理
2.3.6 栈溢出
2.3.7 代码注入
2.3.8 弧注入
2.3.9 返回导向编程
2.4 字符串漏洞缓解策略
2.4.1 字符串处理
2.4.2 C11附录K边界检查接口
2.4.3 动态分配函数
2.4.4 C++ std::basic_string
2.4.5 使字符串对象的引用失效
2.4.6 使用basic_string的其他常见错误
2.5 字符串处理函数
2.5.1 gets()
2.5.2 C99
2.5.3 C11附录K边界检查接口:gets_s()
2.5.4 动态分配函数
2.5.5 strcpy()和strcat()
2.5.6 C99
2.5.7 strncpy()和strncat()
2.5.8 memcpy()和memmove()
2.5.9 strlen()
2.6 运行时保护策略
2.6.1 检测和恢复
2.6.2 输入验证
2.6.3 对象大小检查
2.6.4 Visual Studio中编译器生成的运行时检查
2.6.5 栈探测仪
2.6.6 栈溢出保护器
2.6.7 操作系统策略
2.6.8 检测和恢复
2.6.9 不可执行栈
2.6.10 W^X
2.6.11 PaX
2.6.12 未来发展方向
2.7 著名的漏洞
2.7.1 远程登录
2.7.2 Kerberos
2.8 小结
2.9 阅读材料
第3章 指针诡计
3.1 数据位置
3.2 函数指针
3.3 对象指针
3.4 修改指令指针
3.5 全局偏移表
3.6 .dtors区
3.7 虚指针
3.8 atexit()和on_exit()函数
3.9 longjmp()函数
3.10 异常处理
3.10.1 结构化异常处理
3.10.2 系统默认异常处理