督促自己:2020-9-10
学习记录:
《逆向工程权威指南》上
ARM64
ARM64的CPU中可能运行于ARM模式,不可能运行于 Thmub 或者 Thmub-2 moshi ,所以它必须使用32位指令。
- STP(Store Pair) 指令是把寄存器的值存储到内存中的任意地址,明确是sp寄存器时,是存储在栈中。
- 感叹号标志意味着其标注的运算会被优先执行。(这属于“预索引/pre-index”指令,对应“延迟索引/post-index”指令)
- 在ARM64中,X29寄存器时帧指针,X30起着LR的作用,所以在函数序言和尾声成对出现。
- W0是X0寄存器的低32位
mov x0, #0x0 //#0
-
此处这条指令没有感叹号标记,意味着它将进行赋值操作,再把sp的值与16进行求和运算。------延时索引(post-index)指令
-
RET指令(返回指令)与BX LR作用相同,但是是按照寄存器的名称进行跳转的(默认使用X30寄存器指向的地址)
MIPS
全局指针 Globle Pointer :MIPS重要概念
每条MIPS指令都是32位的指令,所以单条指令无法容纳32位地址(指针)。这种情况下MIPS就得传递一对指令才能使用一个完整的指针。
**概念:**为了简化静态数据的访问操作,MIPS平台特地为此保留了一个专用的寄存器,并且把常用数据分配到了一个大小为64KB的内存数据空间中,这种专用的寄存器就叫做:‘全局指针’寄存器。
它的值是一个指针,指向64KB(静态)数据空间的正中间。而这64KB空间通常用于存储全局变量,以及printf()这类由外部导入的的外部函数地址。
在ELF格式的文件中,这个64KB的静态数据位于.sbss和.sdata之中。".sbss”是small BSS(Block Started by
Symbol)的缩写,用于存储非初始化的数据。".sdata”是small data的缩写,用于存储有初始化数值的数据。根据这种数据布局编程人员可以自行决定把需要快速访问的数据放在.sdata、还是.sbss数据段中。
- GP寄存器:全局指针寄存器
-
初始化呢全局指正寄存器GP寄存器的值,并将其指向64KB数据段的正中央。
-
LW政令(Load Word):加载指令。
-
LUI :Load Upper Immediate
-
ADDIU : Add Immediate Unsigned Word
-
JALR : Jump and Link Register
-
MIPS有一个常量寄存器$0寄存器提供数值0的机制,$0里面的值是常量0。
在MIPS系统中,没有在寄存器之间复制数值的(硬件)指令。
MOVE DST , SRC
指令是通过加法指令ADD DST , SRC, $ZERO
变相实现的,即等效:DST = SRC + 0 -
“T-”开头的寄存器叫做“临时”寄存器,同于保存代码里的临时值。
-
MIPS和其他的一些硬件平台的指令集都没有单独的NOP指令。
NOP的显示:在IDA中,IDA并不会自动把实际指令匹配为NOP指令,所有一般是“OR $AT , $ZERO”形式,表面上看,它将保留寄存器 $AT 的值与0进行或运算,但从本质上讲,就是发给CPU的NOP指令。