Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966933
  • 博文数量: 403
  • 博客积分: 27
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-25 22:20
文章分类

全部博文(403)

文章存档

2016年(3)

2015年(16)

2014年(163)

2013年(222)

分类: 网络与安全

2015-01-26 09:38:42

   接触安全领域也算四年了,大大小小的方向都看过一些,却都未能精通,日渐感到自己实力的匮乏,因此自己决定今天开始来学习下Hack技术最为核心的知识和技能:漏洞挖掘与恶意代码分析。由于主要涉及这个领域,因此所谈与WEB安全脚本之类的关联不大,凡事须追本,根深才能叶茂,希望可以利用近两年的时间,小有所成。
   今天要讲的是Hack技术的编程基础,谈到基础,大家都会给出一些有见解的意见,主流推荐就有C/C++、Java、Perl、Python、VB等;进一步地还有SOCKET编程、系统编程等。自己当初也迷茫了好一阵子,大学学过C,研究生自学了C++,工作后又学习了Python。自己的感觉是:做工程还是要用C++、Java,但是开发安全工具,还是Python更胜一筹,因为易学易用且功能强大,非常适合写自己的个人小工具。自己认为,Hack编程基础应当涉及以下几个方面:
1. C/C++编程语言;
2. 计算机内存知识;
3. Intel处理器的基本知识;
4. 汇编语言基础;
5. gdb程序调试;
6. Python编程技能;
   下面逐一作简要的说明。
一、C编程语言
   C的重要性在于,Unix及Windows的系统主要都是用C来编写的,因此其底层的核心机制还是C的,尽管Widows系统越来越多的使用了C++架构,但是其漏洞存在的根源却和C大致相同,其漏洞存在的根本问题并未解决。C/C++语言可以帮助我们理解实现漏洞程序。这部分涉及漏洞的只需要掌握main()、变量、函数调用、基本输入输出、字符串操作、条件/循环结构等基本知识。
   另外一个需要学习的是基本的编译技能,推荐使用gcc,因为可以根据自主选择获得目标文件(gcc -c)、汇编文件(gcc -S)、关闭栈保护(gcc -fno-stack-protector)等选项,可以说功能十分强大。
   具体的C/C++知识要点可以参考我的文集:http://blog.chinaunix.net/special/show/sid/1129.html

二、计算机内存
   计算机的内存是基本的读写存储器,与我们程序最相关的为RAM,这里需要掌握以下几个小的要点:
-1. 字节序:不同的厂商支持不同的写入顺序,有些厂商认为数据写入时应当由内存的低地址开始写入,比如Intel,因此称之为“小端法”;另外一些厂商认为应当从高地址开始写入,比如Moto,因此称之为“大端法”。后续讨论shellcode时我们将会实际处理这两种写入方法。
-2. 内存中的程序布局:每个进程当然拥有自己的内存空间,进程实际就是程序运行的资源容器,线程才是具体运行的实例。这里我们关注六种主要的内存节,它们是:
-2.1-:.text节,该节与二进制可执行文件的.text节部分一致,主要包含完成工作所需执行的机器指令,该节是只读的,若写入则会导致段错误;
-2.2-:.data节,该节主要用来存储全局初始化变量,如int a = 0,该节大小运行时固定;
-2.3-:.bss节,低于栈(below stack section),该节存储未初始化的全局变量,如int b,该节运行时大小固定;
-2.4-:堆节,该节用于处理程序运行时动态分配的变量,并且分配的空间采取由低地址到高地址的写入方式;
-2.5-:栈节,该节主要处理函数过程调用数据,包括函数内部的变量与语句,但是大多数系统上却是采用由高地址到低地址的方式,这种栈的增长方式导致了魂冲去溢出的存在;
-2.6-:环境/参数节,该节用于保存进程在运行时可能用到的系统级变量的副本,如运行中的进程可访问的路径、shell名称以及主机名等。
-3. 缓冲区、字符串与指针:这部分是C的基础,就不需要再多说了吧?

三、Intel处理器
   处理器部分主要的知识是集中常用的寄存器,如通用寄存器EAX/EBX/ECX/EDX,如段寄存器CS/SS/DS/ES/FS/GS等等,这里比较重要的是ESP(扩展栈指针),我们经常需要借助ESP来确定栈顶的位置;另一个则是EIP寄存器,其中存放着CPU将要执行的下一条指令的地址。
   更多的信息可以参考:http://blog.chinaunix.net/uid-26275986-id-4334522.html

四、汇编语言基础
   做安全就不能不懂汇编,不一定能用汇编编程,但是读懂汇编是基本的要求,不懂汇编的人终究难深入进安全问题的本质。汇编语言分为ATT与NASM两种格式,虽然其最终生成的机器指令完全一致,但是汇编语言表示却有不同。比如ATT的操作数顺序与NASM的相反:
将0x10写入EAX寄存器:
ATT: Movl %eax, $0x10
NASM: mov 0x10, eax
   可以看出,ATT下常量需要使用$前缀,而寄存器则必须使用%前缀,且操作数顺序相反。汇编语言学起来并不容易,所幸我们不是汇编程序员,我们需要的,仅仅是熟悉一些常用命令,需要的时候能够看懂分析而已
1. mov:该命令用于将数据从源复制到目的地,复制成功后源数据不会移除;
2. add/sub:add命令用于将源数据与目的数据相加后结果保存在目的地;sub命令用于将源从目的中减去,并将结果存储在目的地;
3. push/pop:push用于压栈,即将一个数据写入栈中;而pop用于弹栈,即从栈中取出栈顶元素,并且保存到操作数中;
4. xor:异或命令,其实是判断二进制位是否相同的运算,不同为异,即‘1’,相同为‘0’,类似于mod2运算;
5. jne/jnz、je/jz、jmp:jne与jnz是一回事,当零标记ZF=0时跳转;ZF=1时je和jz就会跳转;jmp无论何时都会跳转;
6. call/ret:用于函数过程调用与过程返回;
7. inc/dec:该命令用于将目的操作数递增或递减;
8. lea:该命令用于将源操作数的实际地址加载到目的操作数中,如lea eax, [dsi+4];
9. int:该命令可以向CPU抛出系统中断信号,常见的是0x80,它用于向内核发送系统调用;
   除了基本的汇编命令,还需要了解汇编的寻址模式,主要是各种间接寻址与相对寻址,所幸都不难。另外一个技能是能够使用gdb进行程序的调试,比如设置端点跟踪等。

五、Python编程技能
   这部分主要能够使用Python开发需要的工具就好了,基本的语法概念可以参考主流的教材书籍,也可以参考我的文集:http://blog.chinaunix.net/special/show/sid/1235.html
阅读(1264) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~