您的位置:首页 > 其它

《IDA Pro 权威指南》学习

2020-07-14 06:29 78 查看

在学习0day时,发现ida的知识没有跟上,所以此处进行相关IDA的基础学习。

X86汇编语法:

    AT&T:%前缀,&文字常量前缀

    Intel语法:源操作数位于右边,目的操作数位于左边。使用Interl语法。

反汇编:

    线性扫描反汇编:GUN,WinDbg,OBJdump

    递归下降:

        最典型 IDA Pro

       1.顺序流指令 2.条件分支指令 3.无条件分支指令 4.函数调用指令 5.返回指令

二 逆向与反汇编工具

摘要工具:

nm:声明的函数与全局变量名称

ldd:所需动态库

objdump:

otool:

c++filt:

深度检测工具:

strings:

   仅扫描文件中可加载、初始化后的部分, 使用-a 强制strings扫描整个文件

   strings 不指出字符串在文件中位置,-t 参数 显示所发现的每一个字符串的文件偏移量信息。

   -e 搜索更广泛的字符,如16位Unicode字符。

反汇编器

    x86指令集反汇编器:流式反汇编器ndsasm,distorm

IDA支持资源

    正式帮助文档、Hex-Rays支持页面论团,openRCE.org,RCE论坛,IDA Palace、llfak博客(为什么这里会点名这个博客呢)

IDA目录结构

    cfg:配置文件

    idc:IDA内置脚本语言IDC所需核心文件

    ids:

    loaders:

    plugins:插件

    procs:

    sig:

    til:类型库信息

目前不清楚这些是否重要,看后面的实战利用吧

IDA 入门

启动 IDA:
这个没什么好演示的,,,

IDA数据库文件:

.ido:二叉树形式的数据库

.id1:包含描述整个程序字节的标记

.nam:与IDA的Names窗口中显示给定程序位置有关的索引信息

.til:存储与一个给定数据库的本地类型定义有关的信息。- -?

IDA桌面

IDA数据显示窗口

IDA主要数据显示窗口

  反汇编窗口:IDA-View

    IDA图形视图,IDA文本视图

  函数窗口:

  输出窗口:

次要的IDA显示窗口

  十六进制窗口

  导出窗口

  导入窗口

  结构体窗口

  枚举窗口

其他IDA显示窗口

  Strings窗口:与交叉引用结合

  Names窗口:文件中所有全局名称(F,常规函数。L,库函数。I,导入的名称。C,命名代码。D,数据。A,字符串数据)

  段窗口

  签名窗口

  类型库窗口

  函数调用窗口

  问题窗口

反汇编导航:
  基本IDA导航

    双击导航:双击跳转····

    跳转到地址:Jump -> Jump to Address ,快捷键G

    导航历史记录:Jump-> Jump to Previous Position 向后退,可按ESC(反汇编窗口)

    Jump -> Jump to Next Position 向前进,CTRL+ENTER

    栈帧:基本概念

    调用约定:C调用约定,从右至左。stdcall调用约定,从右至左,函数结束执行时,由被帝欧用的函数负责删除栈中的函数参数。x86 fastcall约定:stdcall辩题,传递给函数的前两个参数分别位于ECX,EDX寄存器中;从右至左;返回调用方时,fastcall函数负责从栈中删除参数。c++调用约定:this指针;其他调用约定:blabala

    局部变量布局

    栈帧示例

  

void bar(int j,int k);
void demo_stckframe(int a,int b,int c){
int x;
char buffer[64];
int y;
int z;
bar(z,y);
}

    sub esp,76 //配置栈帧

    调用 bar

    push dword [esp+4]

    push dword [esp+4]//说明eap一直在变化

    call bar

    add esp,8

    从栈顶删除局部变量:

    add esp,76 //栈指针指向所保存的返回地址

    ret//弹出所需返回地址,插入指针寄存器(此处为eip)

    了解使用专用帧指针:

    push ebp//保存当前调用方使用的EBP的值

    mov ebp,esp //栈指针当前值赋值到ebp

    sub  esp,76//局部变量在此处分配

    正偏移量用于访问函数参数,负偏移量用于访问局部变量

    对函数bar的调用如下

    push dword [ebp-72]  ;push y

    push dword [ebp-76]  ;push z

    call bar

    add esp,8         ;cdec1 requires caller to clear parameters

    每次返回前,恢复调用方的帧指针

  下次从这里开始

  IDA栈视图

    摘要视图,详细视图

    局部变量:被保存的返回地址之上,函数参数位于北保存的返回地址之下。

局部变量:var_为前缀,后接表示变量与被保存的帧指针之间距离的十六进制后缀。

函数参数名以arg_为前缀,后接表示其与最顶端参数之间相对距离的十六进制后缀。

void demo_stackframe(int a,int b,int c)
{
int x=c;
char buffer[64];
int y=b;
int z=10;
buffer[0]='A';
bar(x,y);
}

x = c, y = b, z的初始值常量为10。这里想说的是,程序请求的堆和栈。编译器过后会增大这个请求。如果作为一名漏洞挖掘者,你需要大过编译器请求的空间,才会引发漏洞。

  搜索数据库

    文本搜索:

    Search->Text (ALT+T)  CTRL+T或Search->Next Text命令可重复前一项搜索

    二进制搜索

    Search->Sequence of Bytes(ALT+B)

    搜索如:CA FE BA BE

    搜索内嵌的字符串数据,需将搜索字符串用引号括起来

    Unicode Strings 选项可搜索字符串的Unicode版本。

    "完全匹配" 需要使用Case-sensitive选项

    CTRL+B或Search->Next Sequence of Bytes可搜索随后的二进制数据

 反汇编操作

  名称与命名

    参数和局部变量

    已命名的位置

    寄存器名称

  IDA中的注释

    常规注释

    可重复注释

    在前注释和在后注释

    函数注释

  基本代码转换

    代码显示选项

    格式化指令操作数

    操纵函数

    数据与代码互换转换

  基本数据转换

    指定数据大小

    处理字符串

    指定数组

数据类型与数据结构

  识别数据结构的用法

    数组成员访问

    结构体成员访问

  创建IDA结构体

    创建一个新的结构体

    编辑结构体成员

    用栈帧作为专用结构体

  使用结构体模板

  导入新的结构体

    解析C结构体声明

    解析C头文件

  使用标准结构体

  IDA TIL文件

    加载新的TIL文件

    共享TIL文件

  C++逆向工程基础

    this指针

    虚函数和虚表

    对象生命周期

    名称改编

    运行时类型识别

    继承关系

    C++逆向工程参考文献

交叉引用与绘图功能

  交叉引用

    数据交叉引用

    交叉引用列表

    函数调用

  IDA绘图

IDA的多种面孔

  控制台模式IDA

    控制台模式的共同特性

    Windows控制台

    linux控制台

    OS X控制台

  使用IDA的批量模式

 

转载于:https://www.cnblogs.com/Ccmr/p/7406340.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: