如何利用小游戏开发框架提升企业小程序的用户体验与运营效率
810
2022-09-22
【安全健行】(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++知识要点可以参考我的文集: 计算机的内存是基本的读写存储器,与我们程序最相关的为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将要执行的下一条指令的地址。 更多的信息可以参考: 做安全就不能不懂汇编,不一定能用汇编编程,但是读懂汇编是基本的要求,不懂汇编的人终究难深入进安全问题的本质。汇编语言分为ATT与NASM两种格式,虽然其最终生成的机器指令完全一致,但是汇编语言表示却有不同。比如ATT的操作数顺序与NASM的相反:将0x10写入EAX寄存器:ATT: Movl %eax, $0x10NASM: 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-/special/show/sid/1235.html
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~