【安全健行】(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++知识要点可以参考我的文集:1129.htmlbr /> 
二、计算机内存 
 计算机的内存是基本的读写存储器,与我们程序最相关的为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开发需要的工具就好了,基本的语法概念可以参考主流的教材

 MPLS-虚拟专用网采用多协议标记交换(MPLS)技术,构建企业内部专网,实现企业多个分支机构之间内部数据、语音、视频会议等多种业务通信的服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值