【安全健行】(1):Hacker编程技能

【PS:最近才在之前的博客上写的笔记,直接转过来了。】

公司主营业务:成都网站建设、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出襄汾免费做网站回馈大家。

接触 安全领域也算四年了,大大小小的方向都看过一些,却都未能精通,日渐感到自己实力的匮乏,因此自己决定今天开始来学习下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


网页名称:【安全健行】(1):Hacker编程技能
标题路径:http://pwwzsj.com/article/goohos.html