逆向基础学习(一)

整理了一丢丢逆向的基础知识

位、字节、字

1、位(bit)
来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位,11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态;两个二进制位可以表示00、01、10、11四种状态;三位二进制数可表示八种状态
2、字节(byte)
字节来自英文byte,音译为“拜特”,习惯上用大写的“b”表示。
字节是计算机中数据处理的基本单位。计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1byte=8bit)。八位二进制数最小为00000000,最大为11111111;通常1个字节可以存入一个ascii码,2个字节可以存放一个汉字国标码。
3、字 (word)
计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节构成。例如286微机的字由2个字节组成,它的字长为16;486微机的字由4个字节组成,它的字长为32位机。

计算机的字长决定了其cpu一次操作处理实际位数的多少,由此可见计算机的字长越大,其性能越优越。

异或

异或运算符为 ∧ ,运算时先将两个数转化为二进制类型的,然后如果两个相应位为‘异’,则值为一,否则为0,如

>>> 2^3
1

且异或运算满足交换律

2^3=1  ;
1^3=2  ;
1^2=3  ;

汇编与反汇编

反汇编(Disassembly):把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思

汇编大多是指汇编语言,汇编程序。把汇编语言翻译成机器语言的过程称为汇编

静态分析

程序运行前需要将硬盘内编译好的程序文件装载进内存,然后将指令送入CPU执行,此时程序就像“复活”一样,按照指令的“先后顺序”开始工作,这便是程序的“动态”。与其相反,静态分析就是在程序尚未运行的状态时进行逆向分析的行为。但是,静态分析并非在硬盘上直接进行,仍需将文件存入内存进行分析,只是此时程序文件只是单纯作为数据被逆向软件加载。

伪代码

让人便于理解的代码。不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。

IDA与OD

IDA Pro(简称IDA)是一款交互式反汇编工具

ollydbg反汇编工具是一款在Windows平台工作的32/64位调试器,功能就是将目标代码转为汇编代码

区别

OD用作动态调试,IDA用作静态分析

IDA使用

1.在出现XREF的地方就是有交叉引用在XREF后面的向上箭头,双击它可以跳到它跳转的地方

2.在代码行右击鼠标选择“添加注释”或直接敲击“;”键

3.空格键可以将代码与流程图间切换

4.IDA伪代码转换插件,可以将汇编语言转换为易读的类似于高级语言的伪代码,将光标放置在汇编代码区,敲击F5键就可将汇编语言转换为伪代码。

ascll码的产生

在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

十六进制

十六进制是逢十六进1
0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f表示个位,其中a,b,c,d,e,f分别表示十进制中的10,11,12,13,14,15,在十六进制小于十六的都是用一位来表示,当数等于16的时候就要进位了,变成了10,我们为了和十进制区别,在10前面加0x10,表示这个数是用16进制表示的,那么0x10由于是逢16进一,所以0x10表示的不是10,而是16,所以0x2a=2x16+a=2x16+10=42

\x表示后面的字符是十六进制数

python中的chr函数

chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
语法

以下是 chr() 方法的语法:

chr(i)

参数

i -- 可以是10进制也可以是16进制的形式的数字。

返回值是当前整数对应的ascii字符。

python中的ord函数

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
语法

以下是 ord() 方法的语法:

ord(c)

参数

c -- 字符。

返回值是对应的十进制整数。