freeBuf
二进制逆向基础0x00——0与1
2022-12-22 18:01:22
所属地 湖北省

进制与进制运算

在计算机中存储均是以二进制0与1来存储数据的,2进制与日常生活中常用的10进制均为进制,既然有不同的进制,则会涉及到进制之间的转换。对于逆向而言,进制转换只需要熟练背诵2进制与16进制之间的换算,至于2进制与10进制和16进制与10进制的换算只需要了解即可。

下面这个2进制与16进制之间互转的表是要背下来的,就跟小学学的加法表一样熟练

00000001001000110100010101100111
01234567
10001001101010111100110111101111
89ABCDEF

进制的表示  

任何进制在正常看来就是0-n个表示位,例如10进制则是有0,1,2,3,4,5,6,7,8,9这10个符号组成,那么16进制则是由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F这16个符号来组成。

进制的本质是符号,然而符号是什么,这是由人为规定的,10进制用数字0-9来表示似乎已经成了人们共同认可的习惯,那如果我现在定义10进制是由A,B,C,D,E,F,G,H,I,J这十个符号来表示,那么对于数字表示的1+1=2是不是就可以替换为B+B=C了呢。这一变化对使用者可能并不友好,但这却可以被认为是一种简单的替换加密。

这告诉我们一个道理,进制的本质就是符号的表示。

进制运算

任何一种进制的运算可以转换为加法运算。

进制运算的本质是查表。

我们在十进制的加法运算时,我们脑子里帮我们自动完成了10进制的加法表的运算。那对于其他进制来说,加法运算也是查表。

例如:

0123456
10111213141516

这是7进制的0-13,7进制逢7进1。

那么计算7进制的4+5是怎么做的呢

从4在这个表内所在的位置向后数5个格子得到4+5=12

这是7进制的加法运算举例。

如果我再举一个自定义的进制符号表示,那么也是这样查表进行的运算,例如:

@#$
%^&*

那@+$=?这个怎么进行运算呢?

我们先看看$所在的位置是表格中的第4位,这可以理解为该进制内的3.那么从@所在位置向后数3个格子,得到@+$=%

这个例子可以突出进制加法运算的本质实际上是查表。

源码,补码,反码是人为规定的

对于计算机的存储来说,只能存储0和1,至于这一串0和1该如何解释这是由人为规定的,在各种书本内会看到各种对于源码,补码,反码的解释,其实这三种码存在的意义只是方便人们理解与认识,这对计算机底层是如何存储的起不到任何作用。对于内存中的数据该如何解释,这是由程序员规定的。我们逆向者看到的都是内存中的一串01的表示,至于这串01究竟是什么,这是由我们说了算的。那这三种码实际上对于逆向而言就应该统统忘掉。

举个例子:1000这一串存储应该怎么解释呢,对于一个4位位宽的单元来说如果这是一个有符号数,那么这是-8,如果这是一个无符号数的话,这就是一个8。

这样说的话可能对于有符号数的表示计算就很困难了。那如果没有补码这一概念,我们怎么计算有符号数所代表的负数值呢?

例如4位位宽的有符号数1010这应该代表负数的多少呢?我们用1010所代表的10减去一个16(这个16是因为4位位宽所能代表的数字有16个)得到-6。也就是说如果1010是有符号数,那么他应该代表-6。那1111是有符号数表示什么呢?那就是15-16得到-1。从这里我们可以看出来数的表示和位宽是有关联的。

我们在windows中打开计算器,计算一下16进制的2-3会得到下面图中的结果

1671697419_63a4140ba09766d22fd84.png!small?1671697419758

这是因为该计算器的位宽是64位,也就是16个16进制数,2-3本应得到-1,却得到这样一串字符,是因为64位位宽下-1存储是FFFF FFFF FFFF FFFF,并且对于该计算器来说除了10进制以外的任何进制负数均不会自动转换为我们正常认知中的负数,这是因为对于计算机底层来说存储时是不存在负数的,存储的FFFF FFFF FFFF FFFF是如何解释的是由程序员说了算的。

二进制逻辑运算

逻辑运算包含与运算,或运算,异或运算,在c语言里这三种位运算分别对应符号& , |, ^

与运算

xyresult
000
010
100
111

两者均为1,结果为1

或运算

xyresult
000
011
101
111

两者由一者为1,结果为1

异或运算

xyresult 
000
011
101
110

两者不同则结果为1

计算机是如何计算加法的呢

先说结论:

加法运算是两个操作数xor,后进行与运算后左移一位进行判断是否算完,若为左移1位后结果为0则算完,第一步xor的结果则为最终结果,若不为0则将上一步的xor结果与左移一位后的结果重复以上运算

举个例子:

1+2

在存储时则为0001与0010

先进行xor运算

0001

0010  xor

-------

0011

再进行与运算后左移1位

0001

0010  and

-------

0000  左移一位 <<得到0000

结果为0则说明xor得到的结果为最终结果0011,得到1+2=3

本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
文章目录