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

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

时间: 2024-11-08 10:01:42

【安全健行】(1):Hacker编程技能的相关文章

提高编程技能的11个建议

不说废话,直接上步骤. 1.首先仔细分析问题 2.接着好好想想如何解决这个问题 3.收集整理所有需求. 花点时间将最终产品要实现的目标写下来,并且明确哪些是我们的目标用户群.如果这一步能做好的话,将会给后面节约大量的时间,正所谓磨刀不误砍柴工. 4.写一个全面的实施计划(或模型). 如果是个小项目,这一步出来的可能只是一个基本的流程或者一个简单的等式. 如果是个比较大的项目,这一步有助于我们将它切割成几个模块,然后再按下面的问题思考: 各个模块需要执行什么任务 模块之间如何传递数据 如何调用模块

编程技能的层次

程序员的编程技能随着经验的积累,会逐步提高.编程技能可以分为一些层次,这些层次指的程序员设计和编写程序的能力层级. 第0层——非程序员 初学编程者,遇到问题,完全是懵懵懂懂,不知道该怎么编程去解决问题.也就是说,还是门外汉,还不能被称之为程序员.计算机在他面前还是一个神秘的黑匣子. 第1层——基础程序员 学习过一段时间的编程后,接到任务,可以编写程序完成任务.这一层次编写出来的代码,正常情况下是能够工作的,但在实际运行中,碰到一些特殊条件就会出现各类BUG.也就是说,具备了开发Demo软件的能力

为什么开源可以提高程序员的编程技能?

为什么开源可以提高程序员的编程技能? 记住开放源代码在你参与进去的时候效果最佳.代码更改在大多数项目中都是受欢迎的,但是有很多出力的方法.测试开源代码和文件错误报告:帮助完成文档集:写教程和如何做的例子:参加对话--或者仅仅只是帮助传播.每一件事都能带来改变,并且越多的人参与进来越好! 我已经写了很多年的软件.最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好.这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗? 阅读代码能让你变得更优秀 我在编程生涯的早期就明白我阅读

程序员如何获取新编程技能

目录[-] --> 百万红包.火热开启!!!有你更精彩! 正文 --> “你是怎么学会所有这些框架和语言的?”,最近在黑客马拉松上一个朋友问我. “其实,很简单,只要用你想学的东西去创建一个合适又值得的项目就行了,”我回答说. “真的吗?直接上手搞项目吗?“,他好奇地问. “是啊,还有要向合适的人征求意见.聪明的人通常都很乐于教导和帮助别人.“我告诉我的朋友,同时心中想,我为什么不关于这方面的内容写一篇博客文章呢.——于是有了本文. 对想要在科技领域工作的人非常重要的一件事情就是,你得学会如何

12 个有效的提高编程技能的方法

英文原文:12 Effective Ways To Improve Your Programming 1. 永远不要停止学习和阅读 阅读 书籍,而不只是网站 阅读 只为自我提升,而不是为了下一个项目 阅读 提升你的基础,而不只是最新技术 2. 跟比你聪明的人一起工作 跟比你更聪明的人或者是更有经验的人一起工作,可以让你快速提升 3. 变成一个全才 不要过于钻牛角尖,这可能会让你停滞不前和伤害你的就业前景. 4. 阅读并记录别人的代码 其实写代码比阅读并理解别人的代码要容易的多. 5. 在实际的项

C/C++编程技能【整理】

预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3). 意识到这个表达式将使一个16位机

【安全健行】(3):Shellcode基础

2015/5/15 16:04:49 前面我们简单介绍了Hacker的编程基础,然后讲解了Linux下缓冲区漏洞的基本原理,从中我们了解到一个典型的缓冲区漏洞攻击总是由下面三个部分组成: 具体的实现可能会有变化,但是"万变不离其宗",基本原理还是不变的.我们注意到攻击功能的实现由shellcode来体现,可以说shellcode也是一个缓冲区攻击的核心部分.今天我们来了解下shellcode的知识,首先是一个入门,来介绍下shellcode的使用策略.本节要点如下: 什么是shellc

提高编程技能最有效的方法(转载)

StackExchange.com上有两个贴子(贴子一,贴子二),贴子名叫“What is the single most effective thing you did to improve your programming skills?”(对你的编程技术提高最有效的一件事是什么?) 回复的人中给了很多很不错的建议,我把他们总结了一下,十条,相信一定会对你有用. 和比自己聪明的能力比自己强的人工作.学习他们的代码,他们的做事方法,看一看那些人是怎么处理错误的. 总是倾听别人怎么说,无论那个的

Linux运维都要会哪些shell编程技能?

在充斥着各种的互联网+的数字时代,Linux运维也越来越趋于自动化方向发展,越来越多的运维工作者奔跑在了自动化运维的路上.目前Linux系统下最流行的运维自动化语言就是shell和Python了. 两者之间,shell几乎是IT企业必须使用的运维自动化编程语言,特别是在运维工作中的服务监控.业务快速部署.服务启动停止.数据备份及处理.日制分析等环节里,shell是不可缺的.当然Python也是一门更适合处理复杂的业务逻辑,以及开发复杂的运维软件工具,实现通过web访问等.Shell是一个命令解释