从计算时代的早期开始到现在,安全行业经历了巨大的变化。早期的病毒、蠕虫和恶意软件在当今看来,简直都成了小儿科。随着行业的进一步发展,它又面临着一个转折点。这种日益激烈的矛盾关系(就是这种矛盾关系导致了这个行业的诞生)将会影响到我们的社会、文化和市场吗?让我们来看一组数据。如果研究一下1999年一个漏洞转化成蠕虫病毒所需的时间,再将这个数据与今天相比,就会发现现在出现一个自我繁殖的蠕虫要比1999年快20倍以上:在1999年需要280天,而在2004年仅需4天。这些蠕虫很容易就被制造出来并且随时可能触发,而完成攻击几乎就不需要什么知识。这就意味着有更多的黑客在更短的时间内编写出更多的攻击工具。我们第一次碰到这种新型的狡猾蠕虫,是在20世纪90年代后期出现的“sadmind”等蠕虫。它从攻击Solaris操作系统本地的RPC服务开始,在完成感染之后,它就从Sun Solaris系统向Windows系统进军,再循环往复。我们还看到了同时使用多个攻击方向的蠕虫,采用了针对不同服务的多种攻击技术。还有一些可以自动变种的蠕虫,使得检测和防护它们更加困难。大量的威胁在黑暗中等待,并且还不仅仅是蠕虫。明天的蠕虫将会融合所有这些方面(多系统平台、多应用程序和多方向)产生zero-day蠕虫,却没有修复或防止措施。这些蠕虫将会造成怎样的破坏呢?它会影响所有一切。
我们的大部分市场、基础设施和银行都已经计算机化,并且进行了联网。想想看,如果长达一个月时间,不能够从银行或经纪人那里取出现金;或者不能够横穿铁路或马路,因为飞驰而来的列车或小车也和您一样看到绿灯,那会发生什么情况呢?这些场景都是小说中编造的吗?再仔细想想。以Banker.J worm为例吧。这个蠕虫对系统的影响基本上和前面所说的蠕虫类似,但是另外有个重要的问题就是它首次采用了phishing技术。所谓phishing攻击是指将用户误导到攻击者伪造的Web站点,以期窃取用户的银行用户名和密码的伎俩。当进入这种伪造的站点之后,它自己再使用这个用户名和密码登录到银行,设置一个在线交易收款人,然后进行支付。但是蠕虫并不直接将用户重定向到伪造的站点,而是显示受感染系统上的同样Web页面。他们到底是谁,他们又为什么要这么做呢?他们大部分是些不谙世事的年轻人,受到自负心理和优越感的驱使。另外有些是出于受金钱驱使或者有组织犯罪。无论这些出发动机如何,或者伪造攻击的理由如何,管理员都必须提高自身素质,并解决问题出现的根源。每个产品或步骤都存在有漏洞,在被管理并修复之前,攻击者总会去试图利用它们。没有万全之策可以解决这个问题,也没有某个产品或服务或培训能够给出所有的工具来与这些威胁作斗争。正如战场上的战士一样,您需要掌握一切可以掌握的武器。《安全编程修炼之道》就是您的弹药,是为了保证安全战士们不至于折戟沙场的重要武器。仔细研读《安全编程修炼之道》的每一页,理解其内容,然后做到为我所用。不要让这部出色的作品从您手中轻易滑过。
目录
- 第1章 安全编码基础 1
- 1.1 引言 2
- 1.2 C/C++ 3
- 1.2.1 语言特性 3
- 1.2.2 Hello,World!实例 4
- 1.2.3 数据类型 5
- 1.2.4 流程控制 7
- 1.2.5 函数 8
- 1.2.6 类 9
- 1.2.7 案例研究:傅立叶系数
- 估算 10
- 1.3 Java 13
- 1.3.1 语言特性 14
- 1.3.2 Hello,World!实例 15
- 1.3.3 数据类型 15
- 1.3.4 流程控制 16
- 1.3.5 方法 18
- 1.3.6 类 18
- 1.3.7 获取HTTP报头 20
- 1.4 C# 21
- 1.4.1 移植到C#平台的商业
- 案例 21
- 1.4.2 语言特性 22
- 1.4.3 Hello,World!实例 23
- 1.4.4 数据类型 23
- 1.4.5 流程控制 25
- 1.4.6 方法 26
- 1.4.7 类 26
- 1.4.8 C#线程 28
- 1.4.9 案例研究:命令行IP地址
- 解析 29
- 1.5 Perl 38
- 1.5.1 数据类型 39
- 1.5.2 运算符 40
- 1.5.3 Perl脚本实例 42
- 1.5.4 专用变量 44
- 1.5.5 模式匹配和替换 44
- 1.5.6 正则表达式修饰符 45
- 1.5.7 常用的Perl工具 45
- 1.5.8 I Am a Perl Coder! 46
- 1.5.9 日志修改工具 47
- 1.6 Python 52
- 1.7 本章小结 56
- 1.8 要点回顾 56
- 1.9 相关网站链接 57
- 1.10 常见问题 58
- 第2章 NASL脚本 61
- 2.1 引言 62
- 2.1.1 NASL的发展史 62
- 2.1.2 NASL的目标 62
- 2.2 NASL脚本的语法 63
- 2.2.1 注释 64
- 2.2.2 变量 64
- 2.2.3 运算符 66
- 2.2.4 控制结构 69
- 2.3 编写NASL脚本 72
- 2.3.1 编写NASL个人专用工具 73
- 2.3.2 Nessus框架下的编程 75
- 2.4 案例研究:经典的
- NASL脚本 77
- 2.5 NASL代码移植 81
- 2.6 本章小结 90
- 2.7 要点回顾 91
- 2.8 相关网站链接 92
- 2.9 常见问题 92
- 第3章 BSD套接字 95
- 3.1 引言 96
- 3.2 BSD套接字编程简介 96
- 3.3 TCP客户端与服务器 97
- 3.4 UDP客户端与服务器 103
- 3.5 套接字选项 111
- 3.6 基于UDP套接字的
- 网络扫描 113
- 3.7 基于TCP套接字的
- 网络扫描 122
- 3.8 线程与并行 134
- 3.9 本章小结 136
- 3.10 要点回顾 136
- 3.11 相关网站链接 137
- 3.12 常见问题 137
- 第4章 Windows套接字 139
- 4.1 引言 140
- 4.2 Winsock概述 140
- 4.3 Winsock 2.0 141
- 4.3.1 通过Visual Studio 6.0
- 链接 142
- 4.3.2 通过源代码链接 143
- 4.4 案例研究:使用WinSock
- 抓取网页 146
- 4.5 编写客户端程序 147
- 4.6 编写服务器程序 151
- 4.7 编写exploit及漏洞
- 检测程序 155
- 4.8 本章小结 163
- 4.9 要点回顾 164
- 4.10 常见问题 165
- 4.11 案例研究:使用Winsock
- 执行Web攻击 166
- 4.12 案例研究:使用Winsock
- 执行远程缓冲区溢出 168
- 第5章 Java套接字 173
- 5.1 引言 174
- 5.2 TCP/IP概述 174
- 5.2.1 TCP客户端 175
- 5.2.2 IP地址及域名解析 178
- 5.2.3 基于文本的输入/输出:
- LineNumberReader类 181
- 5.2.4 TCP服务器 185
- 5.2.5 使用浏览器连接
- TCPServer1 189
- 5.2.6 处理多重连接 189
- 5.2.7 WormCatcher 198
- 5.3 UDP客户端与服务器 204
- 5.4 本章小结 211
- 5.5 要点回顾 211
- 5.5.1 TCP客户端 211
- 5.5.2 TCP服务器 211
- 5.5.3 UDP客户端与服务器 211
- 5.6 常见问题 212
- 第6章 编写可移植的代码 215
- 6.1 引言 216
- 6.2 UNIX和Windows移植
- 指南 216
- 6.2.1 预编译指令 216
- 6.2.2 确定操作系统 218
- 6.2.3 进程的创建和终止 222
- 6.2.4 多线程 227
- 6.2.5 信号 234
- 6.2.6 文件操作 236
- 6.2.7 目录操作 239
- 6.2.8 库 242
- 6.2.9 Daemon/Win32服务编程 247
- 6.2.10 内存管理 254
- 6.2.11 命令行参数处理 255
- 6.2.12 整型数据类型 259
- 6.3 本章小结 260
- 6.4 要点回顾 260
- 6.5 常见问题 261
- 第7章 可移植的网络编程 263
- 7.1 引言 264
- 7.2 BSD套接字和Winsock 264
- 7.3 可移植的构件 266
- 7.3.1 返回值 266
- 7.3.2 扩展错误信息 268
- 7.3.3 API 270
- 7.3.4 原始套接字 302
- 7.3.5 Pcap和WinPcap 313
- 7.4 本章小结 319
- 7.5 要点回顾 319
- 7.6 常见问题 319
- 第8章 编写shellcode I 323
- 8.1 引言 324
- 8.2 shellcode概述 324
- 8.2.1 工具 324
- 8.2.2 汇编程序设计语言 325
- 8.2.3 Windows和UNIX的
- 汇编比较 328
- 8.3 寻址问题 329
- 8.3.1 方案一:使用call和
- jmp指令 329
- 8.3.2 方案二:将参数值入栈 330
- 8.4 NULL字节问题 331
- 8.5 系统调用的实现 332
- 8.5.1 系统调用编号 332
- 8.5.2 系统调用参数 332
- 8.5.3 系统调用返回值 334
- 8.6 远程shellcode 334
- 8.6.1 端口绑定shellcode 334
- 8.6.2 套接字描述符重用
- shellcode 336
- 8.7 本地shellcode 337
- 8.7.1 execve shellcode 338
- 8.7.2 setuid shellcode 339
- 8.7.3 chroot shellcode 340
- 8.7.4 Windows shellcode 344
- 8.8 本章小结 350
- 8.9 要点回顾 350
- 8.10 相关网站链接 352
- 8.11 邮件列表 352
- 8.12 常见问题 352
- 第9章 编写shellcode II 355
- 9.1 引言 356
- 9.2 shellcode实例 356
- 9.2.1 write系统调用 359
- 9.2.2 execve shellcode 362
- 9.2.3 端口绑定shellcode 370
- 9.2.4 socket系统调用 373
- 9.2.5 bind系统调用 374
- 9.2.6 listen系统调用 374
- 9.2.7 accept系统调用 375
- 9.2.8 dup2系统调用 375
- 9.2.9 execve系统调用 376
- 9.2.10 反向连接shellcode 381
- 9.2.11 重用套接字的shellcode 384
- 9.2.12 重用文件描述符 386
- 9.2.13 shellcode编码 392
- 9.3 重用程序变量 397
- 9.4 跨操作系统的shellcode 401
- 9.5 了解现有的shellcode 402
- 9.6 本章小结 406
- 9.7 要点回顾 406
- 9.8 相关网站链接 407
- 9.9 邮件列表 407
- 9.10 常见问题 407
- 第10章 开发exploit程序I 409
- 10.1 引言 410
- 10.2 定位漏洞 410
- 10.3 远程与本地exploit程序
- 的编写 411
- 10.4 格式化字符串攻击 412
- 10.4.1 格式化字符串 412
- 10.4.2 格式化字符串漏洞
- 的修复 414
- 10.5 案例研究:xlockmore用户
- 提供的格式化字符串漏洞
- CVE-2000-0763 414
- 10.6 TCP/IP漏洞 417
- 10.7 竞争条件 418
- 10.7.1 文件竞争条件 418
- 10.7.2 信号竞争条件 419
- 10.8 案例研究:man输入验证
- 错误 419
- 10.9 本章小结 421
- 10.10 要点回顾 422
- 10.11 相关网站链接 423
- 10.12 常见问题 423
- 第11章 开发exploit程序II 425
- 11.1 引言 426
- 11.2 为exploit编写套接字和
- 绑定 426
- 11.2.1 客户端套接字编程 426
- 11.2.2 服务器端套接字编程 428
- 11.3 栈溢出exploits 429
- 11.3.1 内存的组织 430
- 11.3.2 栈溢出 431
- 11.3.3 寻找开源软件中可
- 利用的栈溢出 435
- 11.4 案例研究:X11R6 4.2
- XLOCALEDIR溢出 435
- 11.5 堆破坏exploits 440
- 11.6 案例研究: OpenSSL SSLv2
- 畸形客户端密钥远程缓冲区
- 溢出漏洞CAN-2002-0656 444
- 11.7 整型bug exploits 457
- 11.7.1 整数环绕 458
- 11.7.2 忽略大小检查 460
- 11.7.3 其他整型bug 462
- 11.8 案例研究: OpenSSH质询
- 响应整型溢出漏洞
- CVE-2002-0639 462
- 11.9 案例研究:UW POP2 缓冲
- 区溢出漏洞CVE-1999
- -0920 466
- 11.10 本章小结 474
- 11.11 要点回顾 475
- 11.12 相关网站链接 476
- 11.13 常见问题 476
- 第12章 开发exploit程序III 479
- 12.1 引言 480
- 12.2 MSF的使用 480
- 12.3 用Metasploit进行
- exploit开发 485
- 12.3.1 确定攻击向量 485
- 12.3.2 计算偏移量 486
- 12.3.3 选择控制向量 491
- 12.3.4 发现返回地址 495
- 12.3.5 使用返回地址 498
- 12.3.6 确定坏字符 500
- 12.3.7 确定空间限制 500
- 12.3.8 空操作指令拖动器 502
- 12.3.9 选取有效载荷和
- 编码器 503
- 12.4 将exploit集成到MSF中 511
- 12.4.1 框架 511
- 12.4.2 分析一个现有的exploit
- 模块 512
- 12.4.3 覆盖方法 516
- 12.5 本章小结 517
- 12.6 要点回顾 517
- 12.7 相关网站链接 518
- 12.8 常见问题 518
- 第13章 编写安全组件 521
- 13.1 引言 522
- 13.2 COM 522
- 13.2.1 COM对象 522
- 13.2.2 COM接口 522
- 13.2.3 COM运行时 523
- 13.2.4 COM对象的实现 524
- 13.2.5 COM进程内服务器
- 的实现 526
- 13.3 ATL 527
- 13.3.1 C++模板 528
- 13.3.2 ATL客户端技术 528
- 13.3.3 ATL服务器技术 531
- 13.3.4 ATL属性 543
- 13.4 将COM扩展添加到
- RPCDump工具中 547
- 13.4.1 COM EXE服务器
- 实现 548
- 13.4.2 控制流 551
- 13.4.3 应用程序集成例程 552
- 13.4.4 工具接口定义 555
- 13.4.5 组件类 557
- 13.4.6 应用程序集成:
- COMSupport.h 563
- 13.4.7 应用程序集成:
- RPCDump.C 564
- 13.5 本章小结 566
- 13.6 要点回顾 566
- 13.7 相关网站链接 567
- 13.8 常见问题 567
- 第14章 创建Web安全工具 571
- 14.1 引言 572
- 14.2 设计 572
- 14.2.1 攻击签名格式 572
- 14.2.2 签名 573
- 14.3 深入分析 573
- 14.3.1 套接字和执行 573
- 14.3.2 解析器 583
- 14.3.3 头文件 595
- 14.3.4 编译 599
- 14.3.5 执行 599
- 14.4 工具输出 600
- 14.5 本章小结 600
- 14.6 要点回顾 601
- 14.7 相关网站链接 601
- 14.8 常见问题 601
- 附录A 词汇 605
- 附录B 安全工具汇编 613
- 附录C exploit文档 619
- 附录D 系统调用参考 621
-
附录E 数据转换参考 625