2025年2月24日 星期一 甲辰(龙)年 腊月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 软件应用 > 反汇编工具

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

时间:08-16来源:作者:点击数:89

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、参考

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门