02-从零开始用IDA做逆向-进制的基础知识、搜索功能的使用

02-从零开始用IDA做逆向

0x01、进制的概念

计算机中的进制概念是初学者必须知道的基础知识,学习逆向或者构造漏洞利用的时候会接触到这层面知识。二进制,十进制和十六进制的基本概念如下:

BINARY(二进制数):由两个数字0和1组成。

DECIMAL(十进制数):数字由10位数字(从0到9)组成

HEXADECIMAL(十六进制数字):所有数字都用0到F(从0到9,再加上A,B,C,D,E和F )的字符组成,总共有16个字符。其中:A = 10,B = 11,C = 12,D = 13,E = 14,F = 15。

IDA界面的底部有一个可以执行Python语句的文本框。这个功能可以让IDA使用者很方便的在各种进制之间切换:

如果输入0x45会被解析成十六进制数,因为前缀有0x。按Enter(回车)就可以将十六进制转换为十进制。

十六进制数0x45的转换结果如下图:

十六进制的0x45转换为十进制69。如果想将再转换回去,必须使用hex()函数,hex(69)结果如下图所示:

要转换为二进制,可以使用bin()函数:

hex(0x45)转换为二进制的结果数是1000101,因为前缀有0B,说明这是一个二进制数。得到的二进制数还可以用同样的方法转换为十进制或十六进制。

这个功能的作用就是Python栏里中输入数字,按Enter(回车)后将结果显示为十进制,也可以使用Python函数hex()bin()把数字分别转换成Hex(十六进制)或Binary(二进制)。

0x02、十六进制中的正负数表示

逆向过程中在常常会接触到十六进制,32位表示负数的十六进制数又是怎么表示的呢?

十六进制正数的补是它本身。负数的补码是它本身的值每位求反,最后再加一。在32位二进制数中,可以使用第一位来表示0(正)还是1(负)。在IDA窗口VIEW(视图)->CALCULATOR(计算器),可以调出这个窗口。

可以看到十六进制的-0x45的值表示为0xffffffbb,二进制的第一位为1。最小的正数显然是0,最大的正数应该是什么?

上图从符号位可以看出0x7FFFFFFF是最大正数值,因为除了第一位为0其他位都为1,那么把这个值+1后再看看结果。

结果是第一位变为1,其余所有位全变为0。问题是IDA计算器里显示的所有数字都是正数,除非在数字之前加上“ - ”号,例如:

所以最大负值为-1,对应于0xFFFFFFFF,最小负值为0x80000000。如果不考虑符号,那么所有值都是0到0xFFFFFFFF之间的正数。

如果考虑符号位,0x00x7FFFFFFF的范围内是正数,在0xFFFFFFFF0x80000000的范围内是负数。

正数

000000000等于0

000000001等于1

…………………………

…………………………

7FFFFFFF等于十进制2147483647(最大的正数)

负数

FFFFFFFF等于-1

FFFFFFFE为-2

…………………………

…………………………

80000000等于-2147483648(最小的负数)

0x03、ASCII码表

系统打印/显示数据,每个字符都会分配一个对应的十六进制数值表示为字母,数字,符号。下表第一列为十进制值,第二列为十六进制值,第三列代表相应的字符。例如空格的十六进制是0x20或十进制32。这个字符集被称为ASCII(美国信息交换标准代码)

IDA计算器里显示0x45对应的字符为E。

转换字符的另一种方法是使用Python的chr()函数:

在IDA的" HEX DUMP(十六进制转储)"窗口中显示的是十六进制数,多出的一列显示相应的字符:

在图里我们可以看到45表示为字母ê

0x04、IDA中的搜索功能

IDA菜单上有一个“Search(搜索)”选项提供了许多搜索选项,下图所示的IDA版本因为添加了IDA插件显示出来的内容可能不太一样。

Next Code(Alt+C)

搜索下一个被解释为代码的地址,如果无法识别就会跳过。

Search completed. Found at 004011A1.
Search completed. Found at 004011A3.
Search completed. Found at 004011A5.
Search completed. Found at 004011AA.
Search completed. Found at 004011AC.
Search completed. Found at 004011AF.
Search completed. Found at 004011B6. 

NEXT DATA (Ctrl+D)

查找下一个被IDA解释为data(数据)的地址。

IDA 在不对应任何代码的地址处检测到一个双字节(dd),继续搜索会寻找下一个数据。

例如:IDA停在地址:00402004,右侧信息表示在DATA部分下。

Search completed. Found at 00402004.
Search completed. Found at 00402048.

IDA会忽略只包含0而且没有任何引用的地址。也就是说这个选项可以查找程序在使用的数据。

next explored和next unexplored

第一个功能查找已定义的代码或数据(command或data),第二个功能是跳转到没检测到有效指令或数据的区域:

使用【next unexplored】找到了0x402000中带0的区域。

Search completed. Found at 00402000.
Search completed. Found at 00402000.
Search completed. Found at 00402001.
Search completed. Found at 00402001.
Search completed. Found at 00402002.
Search completed. Found at 00402003.
Search completed. Found at 00402008.

可以看到IDA忽略了地址0x402004,因为这样的数据被IDA识别为explored(展开的数据)

INMEDIATE VALUE 与NEXT INMEDIATE VALUE

翻译过来是搜索立即值( INMEDIATE VALUE),搜索下一个立即值(NEXT INMEDIATE VALUE )。可以搜索指定常量值的第一个命令或数据字节。:

如果选择“ Find all occurrences”,IDA就搜索所有事件。如果没勾选这个选项每次都要搜索一次,这种情况就可以使用next immediate value进行下一个搜索。

Search Text与Search Next Text

搜索字符串,还支持正则表达式。

Search Next Text的作用是查找下一条字符串。

SEQUENCE OF BYTES

IDA这个功能可以搜索字节序列十六进制、十进制、八进制字符串。

搜索出来的结果如下图:

在IDA选项上双击第一个结果,打开Options->General--> Number of opcode bytes设置值6,作用是显示每条指令对应的6个操作码。

IDA显示出刚才搜索的操作码90 90

NOT FUNCTION

在下一个地址查找不完整的函数。 在004013D7找到一个独立的RET命令,不属于任何函数。

有些情况是因为个别函数没有被IDA识别为函数,但是指令的确是有效的。

小结

通过这篇文章可以学习到怎么用IDA的“Search(搜索)”功能做内容搜索。

0x05、参考

原文地址:https://www.cnblogs.com/17bdw/p/12286079.html

时间: 2024-10-08 06:28:29

02-从零开始用IDA做逆向-进制的基础知识、搜索功能的使用的相关文章

jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jdk1.6.u45及1.7u45均尝试了,也重现. 重现步骤很简单,使用debug模式启动时较容易出来,debug启动tomcat,(我的是webapp)然后在页面上随便点点即发现eclipse僵死,且任何从浏览器发出的请求都卡住不能被接收执行. 1.然后从任务管理器直接杀掉eclipse对应的jav

(八)从零开始学人工智能--统计学习:统计学习基础知识

目录 统计学习基础知识 1. 统计学习种类 1.1 监督学习 1.2 非监督学习 2. 统计学习中的基本概念 2.1 统计学习三要素:模型,策略,算法 2.2 欠拟合和过拟合 2.3 如何避免过拟合 2.4 过拟合产生的原因 2.5 最大似然估计和贝叶斯估计 3. 线性回归 3.1 经典线性回归 3.2 岭回归(ridge regression) 3.3 lasso回归和ElasticNet 4. 线性分类 4.1 感知机 4.2 逻辑回归(logistic regression) 4.3 So

01-从零开始用IDA做逆向

0x01.IDA是什么 交互式反汇编器专业版(Interactive Disassembler Professional)简称为IDA.IDA Pro是一款支持交互.可编程的.扩展插件.支持多种处理器的逆向工程利器. 0x02.为什么要用IDA Pro? 为什么要用IDA?因为OD是一个只能调试32位程序的调试器.而IDA Pro可以调试32位.64位的程序.除了可以静态反汇编程序,还支持作为调试器对程序调试. 中国人逆向喜欢用OllyDbg:https://ti.360.net/blog/ar

c#中的进制转换

今天偶然接触到了一个位或的表达式,就像着自己做一个进制之间的转换器,基本功不扎实,二进制之间的运算稀里糊涂的. 常见的进制方式,主要有二进制,八进制,十进制和十六进制,通用的转换方式是把非十进制的数据类型转换成十进制的,然后再转换成其他类型. 进制转换的入口函数: /// <summary> /// 进制转换 /// </summary> /// <param name="input"></param> /// <param nam

进制转换函数

一般常用到的进制转换大概就是二进制与十进制,十进制与十六进制,二进制与十六进制之间的转换,好像<stdlib.h>里的itoa函数可以做一些进制转换,不过我还是想自己造造轮子.二进制或十六进制转到十进制很简单,比如我们要将二进制数1011转为十进制表示,你会发现,1011=101*2+1 而101=10*2+1,10=1*2+0,1=0*2+1,也就是说1011可以由((((0*2+1)*2+0)*2)+1)+1来表示,由于计算机在算这一串表达式时基于的是十进制,所以结果就自然而然地转为了十进

蓝桥杯 16进制转换8进制

蓝桥杯 16进制转换8进制 我表示我自己太渣渣了,总是超时,通不过测试. 题目 问题描述 给定n个十六进制正整数,输出它们对应的八进制数.输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000.输出格式 输出n行,每行为输入对应的八进制正整数.注意 输入的十六进制数不会有前导0,比如012A. 输出的八进制数也不能有前导0.样例输入239123ABC样例输出7144

C语言中进制知识总结

1.什么是进制 进制是一种计数的方式,常用的有二进制.八进制.十进制.十六进制.任何数据在计算机内存中都是以二进制的形式存放的. 我对进制的个人理解,二进制数是以2为计算单元,满2进1位的数:八进制数是以8为计算单元,满8进1位的数. 对于任何一个数字,我们都可以用不同的进制来表示,比如,十进制数12,用二进制表示为1100,用八进制表示为14,用十六进制表示为0xC. 2.进制的转换规则 遵循满进制值进1位,个位数变为0的原理,下面我们以十进制数18为例,对1-18中每一个数值转换各种进制做一

02进制_原码反码补码

###02.03_Java语言基础(不同进制数据的表现形式)(掌握)* A:二进制的数据表现形式 * 由0,1组成.以0b(b可以大写也可以小写)开头(JDK1.7版本可以表示二进制了)* B:八进制的数据表现形式 * 由0,1,-7组成.以0开头* C:十进制的数据表现形式 * 由0,1,-9组成.整数默认是十进制的 * D:十六进制的数据表现形式 * 由0,1,-9,a,b,c,d,e,f(大小写均可).以0x开头 * E:案例演示 * 输出不同进制表现100的数据. * 0b100 * 0

Java字符串转16 进制工具类Hex.java

原文:Java字符串转16 进制工具类Hex.java 源代码下载地址:http://www.zuidaima.com/share/1550463378410496.htm Java 字符串转 16 进制工具类 Hex.java 实现 16进制 0xfecd .. 和 java 字符串之间的互转换! 如果做开发,通常用户登陆密码都会 mad5(salt + pwd) 然后再将 md 之后的数据 hex 一下. 这个工具类,就是实现此效果的. /* * */ package com.zuidaim