第一章的内容其实很基础简单,通过第一章学到的东西就是栈和栈帧,以及根据寄存器不同的功能,如何查找数据;

介绍了一系列的逆向手法,以及使用例子讲解如何去查看,了解了什么是API;

这里来复现一下:

逆向手法

① 最常见的就是字符串搜索定位,和数据搜索定位;

② 紧接着就是使用断点不断地去调试,缩小范围,查找功能代码;

③ 修改可疑的语段,当然这些语段一般都是跳转语段,然后去查看现有的功能,如果功能异常,就说明找到了入口;

④ 最需要注意的便是记录地址,以及寄存器的指向,通过栈回溯的功能也可以发掘可疑函数;

⑤ 构建思维,推测编码者的函数运用思路,有一个好的和广的思路才会方便逆向推导(不然就只能硬调);

⑥ API 中文意思就是入口,所谓的API断点,其实就是跳转的地点设置断点去测试,修改;

寄存器

以32位为例子:

① 通用寄存器有8个:

EAX:一般处理操作数的结果数据;

EBX:一般存放基址 (Data段中的数据指针);

ECX:字符串和循环的累计计数;

EDX:I / O 指针;

ESI与EDI:处理操作数据和字符串;

ESP:栈顶指针,始终指向栈顶;

EBP:指向栈帧的返回处;

② 段寄存器有6个:

CS - Code 代码段

DS - Data 数据段

SS - Stack 栈段

ES,FS,GS - Extra 格外数据段

③ 状态控制寄存器1个:

里面一个字节就是一个控制符,cmp,test指令会改变的就是其中的一些字节;

④指针寄存器1个:

EIP:存放指针;

有了寄存器基础,就知道每步执行之后,可以查看ESP来观察栈的情况,查看EBP观察返回处和栈顶的距离,而EAX一般存放的是返回的值;

栈和栈帧

① 栈是一种数据结构,栈即为客栈,只有一个大门,所以先进的人被后进的人堵住,呈现出一种先进后出的情况;

② 在一个程序中,栈的体现方式是一个段,也是一个字节数组,也是内存的一部分;

一般运用栈便是查看栈中的内存,可以往栈中放各种各样的东西,但因为它先进后出的特性,有还原性,在内存中,栈顶往地址小的方向扩展;

就比如,调用一个函数,先入栈的是返回地址,然后存放不下的变量再入栈;当函数结束后,清空变量,并把返回地址送给PC寄存器,栈恢复,继续执行调用完函数的代码;

③ 栈帧存在于栈中,栈类似于视频,它也会有 “帧率” ;一个栈就是一个视频时长条,不同的时段有不同的剪辑和内容,同样,栈中的不同段有着不同的功能,比如有存储主函数的变量区域,和调用的函数区域,一般来讲,一个函数就是栈中的一帧,调用函数区域可以叫栈帧,主函数区域也是另一个栈帧;

④ 添加一个小内容,PC寻址规则;jmp 后面的编码加上下一个地址即为跳转地址;

总结

① 也许是这周看了很多的内容,但是做不起带嘲讽名词的 normal 题,我会觉得学习方法有问题;但其实还好,因为学的是基础知识,应该用Bomb Lab来测验,而normal题里的Va_List我也是第一次接触,所以算不上什么很大的问题,慢慢去做去看WP,就能学好了;

② Pwn方向也多少会一些基础操作了,根据危险函数的特性来栈溢出填充返回地址,来进入shell,下个星期可以来试着解决ret2xxx;

③ 在第一章最有意思也最麻烦的地方就是跟踪数据和跳转去寻找答案,这一点很类似于破解游戏,dll注入过后也是这样去查找,用架空法,最终找到实际执行的那句代码,以及冷却条件;最近也打算用游戏来练练手;