漏洞银行逆向教程2

Author Avatar
kabeor 2月 01, 2018

通用寄存器

数据寄存器 AX CX DX BX

AX=ABCDH 高八位AH–ABH 低八位 AL–CDH

f3eb806a907bf19e8782df6b3d56ff50.png

基本指令

  1. nop 空指令

  2. mov
    MOV指令是数据传送指令,用于将一个数据从源地址传送到目标地址,其特点是不破坏源地址单元的内容。

  3. add 加 格式 ADD OPRD1,OPRD2 结果储存在OPRD1中

  4. sub 减 同上

ps:低位加减不影响高位 后缀h或H表示16进制 16进制从00-FF 00-1=FF FF+1=00

物理地址=段地址*10H+偏移地址 段地址CS 偏移地址IP

8086为16位CPU,地址总线20位,最大FFFFF

DS

mov ax,[bx] 将bx地址中的数赋给ax

push

push ax 把ax放入栈中

ESP指向当前栈点

pop

pop ax 把ax出栈

SS堆栈段 SP堆栈指针

内存寻址方式

mov ax,[bx]

ax=[ds*10H+bx]

loop

循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指令在循环体之后,所以,至少执行1次循环体,即至少循环1次。执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。

loop指令等价于C的do…while结构:
cx = 循环次数;

do {
// 循环体
cx–;
} while (cx);

结构:

1 start: mov ax, 2

2 mov cx, 11

3 s: add ax, ax

4 loop s

and , or 指令

and 与 &

or 或 |

xor 异或 \^

not 非 ~

###内存寻址方式

850e752f91de1fdcd283f6bf58115ea1.png

BP:基数指针寄存器 和堆栈指针SP联合使用,作为SP的校准

8baf906315fa0c7f8b5a99fbe5284d2b.png

ba739276ca6e2949fea10b63a20af7e7.png

(1)在8086CPU中只有这四个寄存器可以在[…]中进行内存单元的寻址。

比如,下面的指令都是正确的:

mov ax,[bx]

mov ax,[bx+si]

mov ax,[bx+di]

mov ax,[bp]

mov ax,[bp+si]

mov ax,[bp+di]

而下面都是错误的:

mov ax,[cx]

mov ax,[ax]

mov ax,[dx]

mov ax,[ds]

(2).在[…]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。

比如下面都是正确的

mov ax,[bx]

mov ax,[si]

mov ax,[di]

mov ax,[bp]

mov ax,[bx+si]

mov ax,[bx+di]

mov ax,[bp+si]

mpv ax,[bp+di]

mov ax,[bx+si+idata]

mov ax,[bx+si+idata]

mov ax,[bp+si+idata]

mov ax,[bp+di+idata]

下面就是错误的

mov ax,[bx+bp]

mov ax,[si+di]

(3)只要在[….]中使用寄存器bp,而指令汇总没有显示给出段地址,段地址就默认在ss中。
比如下面的指令。

mov ax,[bp] 含义:(ax)=((ss)*16+(bp))

mov ax,[bp+idata] 含义:(ax)=((ss)*16+(bp)+idata)

mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)+(si))

mov ax,[bp+si+idata] 含义:(ax)=((ss)*16+(bp)+(si)+idata)

跳转指令和指令跳转原理

jmp指令

jmp 地址 跳转到地址

call指令

189286a35d1d75d2032a3bcab7565f1f.png
934f922798e43615a5845cb60bd1c429.png

ret指令

856636e8d24c26ec2f2906a0aa148469.png
42a41be0aaef0da7b5f35032bd716e89.png

mul指令

9c4ff2fbb0e0f7afd4f5c4f9b812e4a0.png

MUL AB

乘法指令的功能是将A和B中两个无符号8位二进制数相乘,所得的16位积的低8位存于A中,高8位存于B中。如果乘积大于256,即高位B不为0,则OV置1;否则OV清0,CY总是清0。

例如:设(A)=50H(80),(B)=0A0H(160)

若执行MUL AB

则执行结果为:

乘积为3200H(12800),

(A)=00H,(B)=32H,(OV)=1,(CY)=0

####div指令

82a0d1e420eadc3d81e899aba071f948.png

A / B A是被除数,B是除数

除数B有 8位和16位两种,保存在一个reg寄存器里 或是内存单元中。

被除数A 默认存放在AX中(16位以内) 或
AX和DX中(32位,DX存放高16位,AX存放低16位)

结果: 如果除数B是8位,那么除法的结果AL保存商,AH保存余数,

如果除数B是16位,那么除法的结果 AX保存商,DX保存余数。

公式如下:

1:  div byte ptr ds:[0]

  含义:(al)= (ax)/((ds)\*16+0) 的商

         (ah) = (ax/(ds)\*16+0) 的余数

2:div word ptr es:[0]

   含义:(ax) = [(dx)\*10000H+(ax)] / ((es)\*16+0)的商  
         (dx) = [(dx)\*10000H+(ax)] / ((es)\*16+0)的余数



3:div byte ptr [bx+si+8]

   含义:(al) = (ax) / ((ds)\*16+(bx)+(si)+8) 的商

          (ah) = (ax) / ((ds)\*16+(bx)+(si)+8) 的余数



4:div word ptr [bx+si+8]

   含义:(ax) = [(dx)\*10000h+(ax)] / ((ds)\*16+(bx)+(si)+8) 的商

         (dx) = [(dx)\*10000h+(ax)] / ((ds)\*16+(bx)+(si)+8) 的余数

From https://kabeor.github.io/漏洞银行逆向教程2/ bye

This blog is under a CC BY-NC-SA 4.0 Unported License
本文链接:https://kabeor.github.io/漏洞银行逆向教程2/