计算机中的进制概念是初学者必须知道的基础知识,学习逆向或者构造漏洞利用的时候会接触到这层面知识。二进制,十进制和十六进制的基本概念如下:
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(二进制)。
逆向过程中在常常会接触到十六进制,32位表示负数的十六进制数又是怎么表示的呢?
十六进制正数的补是它本身。负数的补码是它本身的值每位求反,最后再加一。在32位二进制数中,可以使用第一位来表示0(正)还是1(负)。在IDA窗口VIEW(视图)->CALCULATOR(计算器),可以调出这个窗口。
可以看到十六进制的-0x45的值表示为0xffffffbb,二进制的第一位为1。最小的正数显然是0,最大的正数应该是什么?
上图从符号位可以看出0x7FFFFFFF是最大正数值,因为除了第一位为0其他位都为1,那么把这个值+1后再看看结果。
结果是第一位变为1,其余所有位全变为0。问题是IDA计算器里显示的所有数字都是正数,除非在数字之前加上“ - ”号,例如:
所以最大负值为-1,对应于0xFFFFFFFF,最小负值为0x80000000。如果不考虑符号,那么所有值都是0到0xFFFFFFFF之间的正数。
如果考虑符号位,0x0到0x7FFFFFFF的范围内是正数,在0xFFFFFFFF到0x80000000的范围内是负数。
正数
000000000等于0
000000001等于1
…………………………
…………………………
7FFFFFFF等于十进制2147483647(最大的正数)
负数
FFFFFFFF等于-1
FFFFFFFE为-2
…………………………
…………………………
80000000等于-2147483648(最小的负数)
系统打印/显示数据,每个字符都会分配一个对应的十六进制数值表示为字母,数字,符号。下表第一列为十进制值,第二列为十六进制值,第三列代表相应的字符。例如空格的十六进制是0x20或十进制32。这个字符集被称为ASCII(美国信息交换标准代码)。
IDA计算器里显示0x45对应的字符为E。
转换字符的另一种方法是使用Python的chr()函数:
在IDA的" HEX DUMP(十六进制转储)"窗口中显示的是十六进制数,多出的一列显示相应的字符:
在图里我们可以看到45表示为字母ê。
IDA菜单上有一个“Search(搜索)”选项提供了许多搜索选项,下图所示的IDA版本因为添加了IDA插件显示出来的内容可能不太一样。
搜索下一个被解释为代码的地址,如果无法识别就会跳过。
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.
查找下一个被IDA解释为data(数据)的地址。
IDA 在不对应任何代码的地址处检测到一个双字节(dd),继续搜索会寻找下一个数据。
例如:IDA停在地址:00402004,右侧信息表示在DATA部分下。
Search completed. Found at 00402004.
Search completed. Found at 00402048.
IDA会忽略只包含0而且没有任何引用的地址。也就是说这个选项可以查找程序在使用的数据。
第一个功能查找已定义的代码或数据(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 )。可以搜索指定常量值的第一个命令或数据字节。:
如果选择“ Find all occurrences”,IDA就搜索所有事件。如果没勾选这个选项每次都要搜索一次,这种情况就可以使用next immediate value进行下一个搜索。
搜索字符串,还支持正则表达式。
Search Next Text的作用是查找下一条字符串。
IDA这个功能可以搜索字节序列十六进制、十进制、八进制字符串。
搜索出来的结果如下图:
在IDA选项上双击第一个结果,打开Options->General--> Number of opcode bytes设置值6,作用是显示每条指令对应的6个操作码。
IDA显示出刚才搜索的操作码90 90:
在下一个地址查找不完整的函数。 在004013D7找到一个独立的RET命令,不属于任何函数。
有些情况是因为个别函数没有被IDA识别为函数,但是指令的确是有效的。
通过这篇文章可以学习到怎么用IDA的“Search(搜索)”功能做内容搜索。