于是我去搞系统安全了(凌乱的读书笔记

于是我去搞系统安全了(凌乱的读书笔记)

以为要搞windows然后看了一部分x86汇编

cs/ds段地址*16+偏移地址=物理地址(地址总线20位 而CPU16位)

cs 代码段寄存器
ip 指令指针寄存器
决定指令

jmp 段地址:偏移地址 #同时修改cs,ip的内容
jmp 某一合法寄存器 #仅修改ip
jmp ax == mov ip,ax

dosbox下debug汇编实验,以管理员身份运行

一个字16位,由高位字节和低位字节组成
高位寄存器值在高位内存地址
低位寄存器值在低位内存地址

ds #数据的段地址
mov al,[0]
mov al,bl
传送字用16位寄存器
mov ax,[0]
mov [0],ax

任何时候 ss:sp指向栈顶元素

栈越界会改写其他位置的数据,栈溢出

push 入栈
pop 出栈
可对合法寄存器和物理地址使用
mov ax, 3333h
push ax
pop ax
mov ax,1000h
mov ds,ax
push [0]
pop [2]

栈为空时,栈中没有元素,故不存在栈顶元素,sp指向栈底下面的单元,
地址为栈中最底部字单元的偏移地址+2

检测3.2 逆序复制
mov ax,2000h
mov ss,ax
mov sp,10h

mov ax,1000h
mov ss,ax
mov sp,0h

[bx] 偏移地址在bx中
mov ax,[bx]

loop 循环
()描述性符号

执行loop s时
(1) (cx)=(cx)-1
(2)cx中的值不为0则继续s
eg: mov cx,11
s: add ax,ax
loop s

累加超过8位寄存器范围需要使用16位寄存器作为中介

输出ax到屏幕
disp_ch proc
push dx
push ax
mov ah,02h
mov dl,al
int 21h
pop ax
pop dx
ret
disp_ch endp

wrhax PROC
push ax
push dx
mov dx,ax
mov ch, 4
L1:
mov cl, 4
rol dx, cl
mov al,dl
and al,0FH
add al,30h
cmp al,3ah
jl printit
add al,7h

printit:
call disp_ch
dec ch
jnz L1
pop dx
pop ax
ret
wrhax ENDP
call wrhax

dw 定义字型数据 位于程序最开始,所以偏移地址为0,偏移地址递增+2
end可以通知编译器程序结束还可以告知编译器程序的入口位置

使用 and or 变ascii码大小写
and al,11011111b
or al,00100000b

bx+idata 指明内存单元,便于处理数组
mov ax,[200+bx]
mov ax,200[bx]
mov ax,[bx].200
如0[bx],5[bx]可视为两个数组

si,di 与bx功能相近
但不能分为两个8位寄存器

更灵活指明内存单元:[bx+si],[bx+di]
mov ax,[bx+di]
mov ax,[bx][di]
循环默认使用cx为计数器
在二重循环时可以使用其他寄存器存储外层cx值
或者开辟一个新的内存空间 用于存储该值
eg:
mov cx,4
s0: mov dx,cx
mov si,0
mov cx,3
s:
loop s
mov cx,dx
loop s0

eg2:
datas segment
dw 0
datas ends

mov dx,datas
mov ds,ax

mov cx,4
s0: mov ds:[40h],cx
mov cx,3

mov cx,ds:[40h]
loop
一般来说,在需要暂存数据的时候,应该使用栈

word ptr 指明指令访问的内存单元是字单元
byte ptr 指明指令访问的内存单元是字节单元
mov word ptr ds:[0],1
inc byte ptr [bx]
add word ptr [bx],2

dup 进行数据的重复
db 3 dup (0)
即 db 0,0,0

offset 取得标号的偏移地址
start: mov ax,offset srart ; mov ax,0
s:mov ax,offset s ; mov ax,3
jmp 无条件转移指令 可以只修改ip 也可同时修改cs:ip
jmp 需要给出两种信息 1转移的目的地址 2转移的距离
jmp short 段内短转移 对ip的修改范围为-128~127 eg: jmp short s ; 8位位移
cpu在执行jmp指令的时候并不需要转移的目的地址 如 机器码都是EB 03

cpu执行指令的过程
1 从cs:ip指向内存单元读取指令,读取的指令进入指令缓冲器
2 (ip)=(ip)+所读取指令的长度,从而指向下一个指令
3 执行指令。转到1,重复这个过程

jmp near ptr s ;16位位移 (ip)=(ip)+16位位移
jmp far ptr s ;段间转移,远转移
mov ax,0123h
mov [bx],ax
jmp word ptr ds:[0] ;word 段内转移
jmp dword ptr ds:[0] ;dword段间转移
其中内存单元地址 可用寻址方式的任意格式给出
eg:
mov ax,0123h
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]

mov ax,0123h
mov [bx],ax
mov word ptr [bx+2],0
jmp dword ptr [bx]

jcxz 条件转移,所有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址
对ip的修改范围为:-128~127
jcxz 标号 相当于 if ((cx)==0) jmp short 标号;

call&ret 转移指令,能修改IP,或同时修改CS和IP,它们经常被共同来实现子程序的设计
ret指令用栈中的数据,修改IP的内容,从而实现近转移,出栈一个字单元,修改ip
retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移,出栈两个字单元,分别改变ip和cs

call指令 两步操作
1 将当前的ip或cs和ip压入栈中(下一条开始)
2 转移

书是经典的《汇编语言》第3版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值