汇编指令中,MOV AL,5CH AND 66H的结果(AX)=00C5是怎么得出的?

&2711P-B6C5A9
2711P-B6C5A9
2711P-B6C5A9
2.转换条件的确定
  转换条件是使系统从当前步进入下一步的条件。常见的转换条件有按钮、行程开关、定时器和计数器的触点的动作(通/断)等。
  3.顺序功能图的绘制
  根据以上分析画出描述系统工作过程的顺序功能图。这是顺序功能设计法中最关键的一个步骤。绘制顺序功能图的具体方法将在下节介绍。
  4.梯形图的绘制
  根据顺序功能图,采用某种编程方式设计出梯形图。
  常用的设计方法有三种:起-保-停电路设计法、以转换为中心设计法、步进顺控指令设计法。
备货,备货,降降降,火火火,火火火&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
公司名称:厦门泰尼电气有限公司
联系人:小黄(销售代表)
联系电话:
传真号码:(麻烦备注01006收)
诚信经营,质量为首,诚信至上,泰尼电气小黄竭诚为您服务!!!
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
ADVANTEST R3261A SPECTRUM ANALYZER 9 kHz to 2.6 GHz
HP -1030MHz SYNTHESIZED SIGNAL GENERATOR w/OP
LIGHTPOINTE FLIGHT STRATA LFSA-0155-4KS-M3S WIRELESS
SONY TEKTRONIX AFG2020 ARBITRARY FUNCTION GENERATOR
250MS/s synthesized FUNCTION GENERATOR WITH OPT 02
HP 8349B 2GHz-20GHz MICROWAVE AMPLIFIER NICE CONDITION
JDS FITEL SB SERIES FIBER OPTIC SWITCH100-240V 50/60MHz
Hewlett-Packard / Agilent E5272A FRAME WITH E5281A UNIT
ALCATEL ATH Turbomolecular Pump
Tektronix SJ300E Sonet SDH Jitter Wander Analyzer
Hewlett Packard E C-SIZE VXI MAINFRAME
Hewlett Packard E C-SIZE VXI MAINFRAME
ADVANTEST R3261A SPECTRUM ANALYZER 9kHz to 2.6GHz OPT15
HP 83430A LIGHTWAVE TRANSMITTER 1310.5nm W/ OPTION 130
HP 2/2.7MHz ULTRASOUND TRANSDUCER PROBE
HP 2MHz ULTRASONIC TRANSDUCER ULTRASOUND
HP 83430A LIGHTWAVE TRANSMITTER 1309.7nm W/ OPTION 130
AGILENT HP 85046B S-PARAMETER TEST SET 300KHZ-2GHZ
ROHDE & SCHWARZ SMX SIGNAL GENERATOR 100KHz - 1000MHz
STROMAG STROMATIC ADC 012.3 V DIGITAL SERVO CONTOLLER
HP SA 3.7/5.0 MHz Phased Array Sector
ANRITSU MS2601K SPECTRUM ANALYZER 9KHz-2.2GHz
KEPCO BOIPOLAR OPERATIONAL POWER SUPPLY BOP 500M
PENTAX EC-3400F VIDEO COLONOSCOPE FLAXIBLE ENDSCOPE
AGILENT 8 LIGHTWAVE SWITCH,115/230V, 50/60MHz.
HP 70004A DISPLAY FRAME AND HP70311A CLOCK SOURCE
HP AGILENT E6392B GSM MOBILE MS TEST SET WITH OPT 002
OLYMPUS CV-200 ENDOSCOPY VIDEO PROCESSOR UNIT WITH WIRE
BALDOR AC SERVO DRIVER SBSC2035 IN 320VDC OUT 0-250VAC
PHILIPS 2/3.7MHz ULTRASOUND TRANSDUCER PROBE
HP 70001A 8 SLOT SYSTEM MAINFRAME CHASIS WITH 70311A
& & & & & TEKTRONIX TDS 520A TWO CHANNEL DIGITIZING 500MHz
OMRON CS1H-CPU66H PROGRAMMABLE CONTROLLER WITH MODULES
0.4X-2.5X KAPS BINOCULAR STEREOZOOM MICROSCOPE W/EYES.
Omron R88D-UA20HA AC Servo driver 200V 11.0A 750W
ET EURO TEST EHV10/SL HIGH VOLTAGE TESTER
CARL ZEISS Ni3 AUTO LEVEL SURVEY EQUIPMENTw/WOODEN CASE
OMRON CS1G-CPU42H PLC CPU W/ MC421-V1, SRM21-V1, PA204S
OMRON CS1G-CPU42H PLC CPU W/ MC421, SRM21-V1, PA204S
BALDOR AC SERVO DRIVER DBSC1110-GAAW 3PHASE AC230V
HP 8405A VECTOR VOLTMETER WITH PROBE
AGILENT HP 6621A SYSTEM DC POWER SUPPLY
LECROY 9310M DUAL 300MHz OSCILLOSCOPE
GOULD DIGITAL RECORDING OSCILLOSCOPE DRO 1624 W/ PRINTE
ZYGO INTERFEROMETER MICROSCOPE FOR PARTS
PANASONIC VP-7706A AUDIO ANALYZER
GALIL DMC-1580 MOTION CONTROLLER.
Keithley 7002 10-Slot Switch Mainframe with 3 cards
ADRET 104A DC VOLTAGE STANDARD SOURCE
MICRO LASER PARTICLE SPECTROMETER MICRO LPS 16-(3)
ACS POWER CONVERSION EQUIPMENT DRIVE SB-211AT2-2 230VAC
ACS POWER CONVERSION EQUIPMENT DRIVE SB-212AT2-2 230VAC
PARKER COMPUMOTOR ATW 2 AXIS CONTROLLER
ESHED ROBOTIC SCORBOT ER9 ROBOT CONTROLLER
ESHED ROBOTIC SCORBOT ER9 ROBOT ASRS CONTROLLER
ESHED ROBOTIC SCORBOT ER9 ROBOT CIM CONTROLLER
ESHED ROBOTIC SCORBOT ER9 CIM CONTROLLER W/TEACH PENDEN
NIRECO TENTION CONTROLLER UNIT TC 640 TC640 SUPPLY230V
HP Agilent 8903A 20hz-100khz Audio Analyzer w/ Opt. 001
LEICA 020-650-070 MICROSCOPE & SYSTEME GMBH WETZLAR.
DC VOLTAGE CURRENT STANDARD
&(文:star005)
联系我们时请一定说明是在模具联盟网上看到的此信息,谢谢!
联系电话:,欢迎您的来电咨询!
本页网址:
推荐关键词:2711P-B6C5A9
发表评论共有位网友发表了评论
版权与免责声明:
①凡本网注明"来源:模具联盟网"的所有作品,版权均属于模具联盟网,转载请必须注明模具联盟网,违反者本网将追究相关法律责任。
②本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
③如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
联 系 人:
联系地址:
厦门市海沧区海沧街道滨湖一里7号
联系电话:
在线咨询:
企业网址:
公司网站:
联系我时,
告知来自模具联盟网请问在上海哪里公共英语三级培训班?要通过率高的
11-08-16 &
你好!我的妹妹就是去年通过的公共英语三级,她也是上了一个培训班才通过的,你可以联系QQ:。听说他们不通过可以退款的。
请登录后再发表评论!有朋友会这道编程题吗,用汇编语言啊。。跪求答案啊。。。设在数据段中以BLOCK为首地址的存储区域中存..._百度知道
有朋友会这道编程题吗,用汇编语言啊。。跪求答案啊。。。设在数据段中以BLOCK为首地址的存储区域中存...
有朋友会这道编程题吗,用汇编语言啊。。跪求答案啊。。。设在数据段中以BLOCK为首地址的存储区域中存放了16个单字节带带符号为,欲求出这16个数的平均值,并将结果存放到AVERAGE单元,试设计实现这一功能的汇编语言程序段
我有更好的答案求助知道网友
data segment
db 16 dup(?)
db 0data ends code segmentstart:
mov ax,data
lea si,block
mov cx,16_Add:
mov bl,[si]
mov average,al
mov ax,4c00h
int 21hcode endsend start
12, 0, -20, 45, -29, 36, 50, 0, 100, -100在这里任意存放 10 个带符号数(-128~+127)
DS:DATA, CS:CODESTART:
CX, 16_ADD:
AVERAGE, AL
本回答被网友采纳
交话费的何润东还能有头发
你好,我来为你解答:第一章 1.1 CPU 分析、控制并执行指令的部件 IP 指示下一条将要执行的指令的地址 SP 保存当前栈顶地址的寄存器 状态标志 指出指令操作结果的标志,如ZF,CF等。 控制标志 控制操作的标志,只有DF,IF,TF三个。 ALU 进行算术和逻辑运算的单元 存储器 存储程序、数据等信息的的记忆装置。 物理地址 CPU发出的访问存储器的地址信息。 偏移地址 相对于段起始地址的偏移量。 段地址 是逻辑段的起始地址。 1.2下列操作可使用哪些寄存器 ·存放各种运算操作的数据:AX,BX,CX,DX,SP,BP,SI,DI (我的辅导书上没有SP,BP;why?) ·存放数据串操作时的计数值:CX ·查看程序已执行到哪条指令的地址:IP ·查看堆栈中当前正要进行入出栈的存储单元的地址:SP ·查年运算结果是否等于零:PSW的ZF ·查年程序中的数据存放段区是从哪个地址开始的:DS,ES ·查看程序中的指令存放的段区是从哪个地址开始的:CS 1.3段地址和偏移地址为A的存储单元的物理地址是什么?而1109:00EA或A的存储单元的物理地址又是什么:这说明了什么问题? A物理地址为::00EA的物理地址为::0F2A的物理地址为:1117A.说明物理地址不变,段地址改变,偏移地址也随之变化. 1.存储器地址对应的数据(图略) 75422H(字节):9CH 75424H(字节):5DH 75422H(字):249CH 75424H(字):E65DH 第二章 2.1写出相应的汇编语言指令: (1)以寄存器BX和SI作为基址变址寻址方式把存储器中的一个字传送到CX寄存器。 MOV CX,[BX][SI(注:寄存器寻址只能使用:BX,BP,SI,DI;且BX、BP或SI,DI不能同时使用,可能我说的不太对,请版主确认一下) (2)以寄存器BX和偏移量value作寄存器相对寻址方式把存储器的一个字和AX相加,把结果(即和)送回那个字单元中。 ADD value[BX],AX (3)将一个字节立即数0B6H与符号的地址为NUM的存储器字节单元内容相比较。 CMP BYTE PTR 0B6H,NUM(如果前面不加BYTE RTR,默认的也是字节比较吧?还有双字比较,应该怎么写?) (4)测试从寄存器BP和DI、偏移量COUNT作为相对基址变址寻址方式寻址的存储器字节单元内容最高位B7的值,字节单元的内容不能改变。 TEST COUNT[BP][DI],80H (5)将AH寄存中的高4位和低4位数据互换。 MOV CL,4 ROL(或ROR) AH,CL (6)清除以寄存器SI间接寻址的存储器字单元,同时清除CF标志位. XOR AX,AX ;使AX=,CF=0 MOV [SI],AX 2.2设DS=1000H,BX=2865H,SI=0120H,偏移量D=47A8H,试计算下列各种寻址方式下的有效地址. 1)使用D的直接寻址 47A8H (这道指令怎么写?如何定义D的值) 2)使用BX的寄存器间接寻址 2865H 3)使用BX和D的寄存器相对寻址 700DH 4)使用BX、SI和F的相对基址变址寻址 712DH 5)使用BX、SI的基址变址寻址 2985 2.3假设DS=1000H,BX=2A80H,CX=3142H,SI=0050H,(10050H)=3BH,(10051H)=86H,(11200H)=7AH,(11101H)=64H,(12ADOH)=0A3H,每小题的括号中分别填入指令执行后的结果: 1)MOV AX,1200H ;AX=1200H 2)MOV AX,[1200H] ;AX=1200H(书上的答案是647A,但是我用DEBUG试了一下是1200,可能是因为我的PII的原因吧,希望有8088的朋友能试一下,版主,考起试来应该怎么写呀?) 3)ADD [SI],CX ;(10050H)=7DH,H,ZF=0,CF=0,SF=1,OF=1 4)OR BYTE PTR [BX][SI],54 ;(12AD0H)=F7,CF=0,OF=0 5)MOV 150H[BX],CH ;[12BD0H]=31,CH=31 2.4指出下列指令的错误原因 1)MOV AX,CL 两操作数的长度不一样. 2)MOV CS,AX 不能给CS赋值 3)INC BETA[BP] 书上说:没有数据类型说明,但我认为它应该自动默认为字节操作,版主再来看看吧 4)MOV ES,1850H 立即数不能直接送段寄存器 5)ADD BX,DS 段寄存器不能做为加法操作数使用 6)AND AX,[CX] 寄存器寻址只能使用BX,SI,DI,BP 2.5说明下列指令执行的操作,说明原始数据和结果数据的存储地点 贴子相关图片: 作者: 218.27.73.*
09:21 回复此发言 --------------------------------------------------------------------------------2 汇编语言程序设计课后习题答案 [原始数据](结果数据) 1)mov [2700h],cx 这条指令在我的P4试了一下,是错误的;如果考试时出只好说是:把[CX]中的内容送到(数据段中偏移地址为2700h字单元)中; 2)MOV DH,50[SI] 将[数据段中有效地址为SI+50的字节单元]中的数据送入(DH)中; 3)LEA SI,ARRAY 将ARRAY的偏移地址送入(SI),结果数据在[代码段对相应指令字节中] 4)DAS 将AL中的压缩的十六进制数调整为十进制数,结果数据在AL中,原始数据也在AL中 5)ADC CL,[BX] 将BX和CL的和加上CF的值后,存放在CL中,结果在CL中,原始在BX,CL,CF中 6)ROR WORD PTR ALPHA[SI],CL 将偏移地址为ALPHA+SI字单元中的数据循环移,结果和原始都在哪个字单元中. 2.6指出下列无条件转移指令的转移地址中的偏移地址是什么,存放在何处. 1)JMP BX 偏移地址是BX中的值,存放在BX中 2)JMP WORD PTR [BX] 偏移地址是以BX中的值为偏移地址的一个字单元中的数值,存放在以BX中的值为偏移地址的一个字单元中 3)JMP NEAR PTR PROA 偏移地址为PROA的偏移地址,存放在CS段的相应指令处(书上说的不一样,请版主做下这道题) 4)JMP FAR PTR FAR_PRO 偏移地址为FAR_PRO的偏移地址,,存放在CS段的相应指令处 5)JMP SHORT AGAIN 偏移地址为AGAIN的偏移地址,存放在CS段的相应指令处(书上说的不一样,请版主做下这道题) 6)JMP DWORD PTR [BX][DI] 偏移地址是以BX,DI为基址变址寻址的两个字单元的内容,存放在以BX,DI为基址变址寻址的两个字单元中 2.7写出把道址为BLOCK的字数组的第六个字送到CX寄器的指令序列,要发别使用以下几种寻址方式 1)以BX寄存器的间接寻址 LEA BX,BLOCK+0AH MOV CX,[BX] 2) 以BX寄存器的相对寻址 LEA BX,BLOCK MOV CX,0AH[BX] 3) 以BX,SI的基址变址寻址 LEA BX,BLOCK MOV CX,[BX][SI] 2.8指出下列指令的源和目的操作数的寻址方式 (目地操作数寻址方式;原操作数寻址方式) 1)MOV ARRAY,BX 直接寻址;寄存器寻址 2)ADC CX,ALPHA[BX][SI] 寄存器寻址;相对基址变址寻址,寄存器寻址 3)AND BYTE PTR GAMMA [DI],B 寄存器相对寻址;立即寻址,寄存器相对寻址 4)INC WORD PTR [BX] 寄存器间接寻址;寄存器间接寻址 5)TEST EX:[IS],DX (目的操作数?在哪?只改变标志位,算寄存器寻址吗?书上写的寄存器间接寻址,不明白);寄存器间接寻址,寄存器寻址 6)SBB SI,[SI] 寄存器寻址;寄存器寻址,寄存器间接寻址 2.9分别说明下列每组指令中的两条指令的区别: 1) MOV AX,TABLE LEA AX,TABLE 前者是将变量TABLE的内容传递给AX;后者是将TABLE和偏移地址传递给AX 2) AND BL,0FH OR BL,0FH 前者是BL的内容与0F相与;后者是BL与0FH相或 3) JMP SHORT L1 JMP NEAR PTR L1 前者为短跳转,后者为近跳转 4) MOV AX,[BX] 第三章 3.1 1)使计算机执行某种操作的命令 ;指令 2)表示计算机执行什么操作的符号 ;助记符 3)存放指令机器码的存储器段区 ;代码段 4)指出指令在程序中位置的符号地址 ;标号 5)将汇编语言程序翻译成机器码程序的实用程序 ;汇编程序 3.2试写出完成下列操作的指示性语句: 1)将56H,78,0B3H,100存放在定义为字节变量ARRAY的存储单元中. ARRAY DB 56H,78,0B3H,100 2)将字数据65,0A6H存放在定义为字节变量DATA的存储单元中. ARRAY DB 65H,29H,45H,95H,0BH,0A6H ;书上在0B和0A6H后面有个0,不什么是什么. 3)将字节数据56H,0C6H,78H,12H存放在字变量ALPHA的存储单元中.并且不改变数据按字节存储的次序 ALPHA DW 0C656H,1278H 4)在BETA为道址的存储单元中连续存放字节数据:2个23,5个'A',10个(1,2),20个空单元。 BETA DB 2 DUP (23),5 DUP ('A'),10 DUP (1,2), 20 DUP (?) 5)在STRING为首址的存储单元中存放字符串'THIS IS A EXAMPE' STRING DB 'THIS IS A EXAMPE' 3.3下列伪指令序列中,BASUB的值为多少?它表示什么意义? 作者: 218.27.73.*
09:21 回复此发言 --------------------------------------------------------------------------------3 汇编语言程序设计课后习题答案 BUFF DB 7,6,'56',? ARRAY DW 0,67H,7 BASUB EQU ARRAY-BUFF BASUB的值是5,它表示ARRAY与BUFF的首地址的差. 3.4假设程序中的数据定义如下: BUF1 DB 100 DUP ('a') BUF2 DW C5H BUF3 DB 20 DUP (?) BUF4 DB 7,4,6,9,8 1)用一条指令将BUF1的谝移地址送入BX. LEA BX,BUF1 2)将BUF2的第三字节数据送入CL MOV BYTE PTR CL,[BUF2+2] 3)将0A6H送入BUF3的第10个字节单元中 MOV BYTE PTR [BUF3+9],0A6H 4)用伪指令写出BUF1和BUF2二者的总长度(字节数) L1_2 EQU BUF3-BUF1 5)用一组指令写出BUF2的第二个数据567和BUF4的第三个数据6相加,结果(和)送入BUF3 MOV AL,BUF4+2 MOV AH,0 ADD AX,BUF2+2 MOV BUF3,AX 3.5指出下列第一对伪指令语句的区别: 1)X1 DB 76; X2 EQU 76 前者是向X1的字节单元存入76,后者是将X2的值定义为76. 2)X1 DW 3548H; X2 EQU BYTE PTR X1 前者是定义X1的字单元值为3548,后者是定义X2的值为X1的第一个字节单元的值48. 3)X1 EQU 3; X2 = 3 两者都是赋值语句,但前者只能定义一次,后者可以重复定义. 4)X1 DW 3678H; X2 DB 36H,78H 前者的字节单元内容依次为78,36;后者的字节单元内容依次为36,78. 5)X1 DW 6341H; X2 DW 6341 前者为十六进制的6341;后者为十进制的6341 3.6设置一个数据段DATA_SEC,其中连续存放下列的8个变量,用段定义语句和数据定义语句写出数据段: 1)DATA1为字符串变量:'DATA SEGMENT' 2)DATA2为十进制数字节变量:72,65,-10 3)DATA3为十六进制数字字节变量:109,98,21,40 4)DATA4为10个零的字节变量. 5)DATA5为数字的ASCII字符字节变量:12345 6)DATA6为十进制的字变量:7,9,298,1967 7)DATA7为十六进制的数的字变量:785,13475 8)DATA8为本段中字变量和字节变量之间的字节单元数之差 DATA_SEC SEGMENT DATA1 DB 'DATA SEGMENT' DATA2 DB 72,65,-10 DATA3 DB 6DH,62H,15H,28H DATA4 DB 10 DUP (0) DATA5 DB '12345' DATA6 DW 7,9,298,1967 DATA7 DW H D1 EQU DATA6-DATA1 D2 EQU $-DATA6 DATA8 EQU D2-D1 3.7设程序中的数据定义如下: DATA1 DW ? DATA2 DB 32 DUP (?) DATA3 DD ? DLENGTH EQU $-DATA1 问DLENGTH的值为多少?它表示什么意义? DLENGTH的值为38,表示DATA1,DATA2,DATA3所占用的字节数之和 3.8指出下列第一小题中的伪指令表达的操作哪些是错误的?错误在哪时? 1) ALPHA EQU 78H BETA EQU ALPHA+1 没错. 2) DATA DB 395 1个字节最多能够表示256 3) X1 SEG . . . X1 ENDS SEG应该写成SEGMENT 4) ALPHA EQU BETA BETA没有赋值 5) COUNT EQU 100 COUNT EQU 78 不可以用EQU给一个变量重复赋值 6) MAIN PROC . . . ENDP 过程结束标志,应该有个MAIN 7)ARRAY DW 10 DUP (?) . . . JMP ARRAY ARRAY是变量,JMP不能跳到ARRAY处 8) SEGMENT CODE_SEG . . . ENDS CODE_SEG 书写格式错误,应写为 CODE_SEG SEGMENT CODE_SEG ENDS 3.9对于下面的数据定义,写出各条指令执行的结果: FLDB DW 0A24FH TABLE DB 32H,52,0C2H,213 TEA EQU WORD PTR TABLE ARRAY DB 'ABCD' COUNT EQU $-ARRAY 1)MOV AX,FLDB AL=(4FH) 2)MOV BX,TEA BH=(52H)
3条折叠回答
为您推荐:
其他类似问题
汇编语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Intel Sysret 漏洞在WIN7 X64下的实现分析_西西软件资讯
西西软件下载最安全的下载网站、值得信赖的软件下载站!
→ Intel Sysret 漏洞在WIN7 X64下的实现分析
类型:壁纸主题大小:7.5M语言:中文 评分:5.7
intel&&sysret 漏洞在WIN7 X64下的实现分析。前半部分是网上现有的文章分析,后半部分为代码实现分析1. 漏洞浅析在x64系统上,最重要的48位虚拟地址将被用于地址转换,而此外48到63的任何虚拟地址必须是47位的副本。否则处理器会抛出异常:保护故障(GP)。这会将虚拟地址分割位两个区块,如:?& && && &规范的高阶半区: 0xFFFFFF`FFFFFFFF& && & 0xFFFF0?& && && &规范的低阶半区: 0x00007FFF`FFFFFFFF& &0x00000而所有这之间的地址都会被认为是不规范的。SYSRET指令被用于传递返回到普通用户模式(user-mode)。它将RCX寄存器中的值复制到RIP寄存器中,并把Code Segment Selector位切换位普通用户模式(user-mode)。然而,RCX寄存器是一个通用寄存器,它可能包含的任何值,包括不规范的地址。并且SYSRET指令一旦抛出异常是不负责退栈切换回用户空间的,也不负责为GS寄存器做扫尾工作。这意味着,程序员在调用SYSRET指令前后都需要为GS,RSP,RBP做额外的处理。而我们恰好发现intel的SYSRET指令实现中存在一个缺陷: 如果一个不规范的地址从RCX寄存器传递而抛出GP, 那么在CG,RBP和RSP返回普通用户模式(user-mode)前, 其ring0的权限不会被取缔(因为没有任何扫尾工作)。2. MS windows中的漏洞触发利用这个漏洞的关键是要抛出一个不规范的返回地址,而为了在MS Windows中触发这个漏洞,我们可以有以下的方式:?& && && &映射内存并在0x7FFF`FFFFFFFF位执行一个系统调用。这将返回一个不规范的地址。然而,由于Windows地址空间的限制,这个地址是不可达的,因此此路不通罗马。?& && && &寻找一个系统调用,并能手动改变返回地址。关于后者,可借力于UMS(User-Mode Scheduling 用户模式计划程序)。&&: MSDN,UMS是一个轻量级的机制,应用程序可以用它来安排自己的线程。应用程序可以在用户模式下自由进行UMS线程间的切换而不必不涉及系统调度。为了使用UMS线程,可以用CreateUmsCompletionList()函数创建一个的UMS调度列表。scheduler线程将被链接到此调度列表,而scheduler线程也将需要被创建(scheduler线程通过EnterUmsSchedulingMode()从普通线程晋升为UMS线程)。如果UMS线程启动或阻塞,那么ExecuteUmsThread()函数需要被调用。如果没有, scheduler需要确定哪些线程将随后运行。它将排列调度列表,选择正确的线程。EnterUmsSchedulingMode()函数是ntdll.dll中实现的。从汇编代码中,我们可以看到,它得到当前的UMS线程,完成链接调度列表,保存线程上下文(寄存器),然后调用RtlpUmsPrimaryContextWrap()函数。1.& & .text:F33A20 RtlEnterUmsSchedulingMode2.& & .text:F33A203.& & .text:F33A20 arg_0 = qword ptr 84.& & .text:F33A20 arg_8 = qword ptr 10h5.& & .text:F33A20 arg_10 = qword ptr 18h6.& & .text:F33A207.& & .text:F33A20 mov [rsp+arg_8], rbx8.& & .text:F33A25 mov [rsp+arg_10], rsi9.& & .text:F33A2A push rdi10.&&.text:F33A2B sub rsp, 20h11.&&.text:F33A2F mov rsi, [rcx+8]12.&&.text:F33A33 mov rbx, [rcx+10h]13.& & [...]14.&&.text:F33A5D loc_78F33A5D:15.&&.text:F33A5D mov rdx, rsi16.&&.text:F33A60 xor ecx, ecx17.&&.text:F33A62 call RtlpAttachThreadToUmsCompletionList18.&&.text:F33A67 test eax, eax19.&&.text:F33A69 js short loc_78F33AA020.&&.text:F33A6B lea rcx, [rsp+28h+arg_0]21.&&.text:F33A70 call RtlGetCurrentUmsThread22.&&.text:F33A75 test eax, eax23.&&.text:F33A77 js short loc_78F33A9424.&&.text:F33A79 mov rcx, [rsp+28h+arg_0]25.&&.text:F33A7E call RtlpSaveUmsdebugRegisterState26.&&.text:F33A83 test eax, eax27.&&.text:F33A85 js short loc_78F33A9428.&&.text:F33A87 mov rdx, rdi29.&&.text:F33A8A mov rcx, rbx30.&&.text:F33A8D call RtlpUmsPrimaryContextWrap31.&&.text:F33A92 jmp short $+2RtlpUmsPrimaryContextWrap()函数负责调用scheduler并保存线程信息在一个结构中(ps:这是一个非文档化的结构),通过反汇编我们可以知道此结构为:&&RSP&&RBP&&返回地址1.& & .text:EA03F0 RtlpUmsPrimaryContextWrap2.& & .text:EA03F03.& & .text:EA03F0 var_108 = xmmword ptr -108h4.& & .text:EA03F0 var_F8 = xmmword ptr -0F8h5.& & .text:EA03F0 var_E8 = xmmword ptr -0E8h6.& & .text:EA03F0 var_D8 = xmmword ptr -0D8h7.& & .text:EA03F0 var_C8 = xmmword ptr -0C8h8.& & .text:EA03F0 var_38 = byte ptr -38h9.& && &[...]10.&&.text:EA0452 mov [rax+30h], r1511.&&.text:EA0456 mov r10, gs:14A0h12.&&.text:EA045F lea r10, [r10+10h]13.&&.text:EA0463 lea r11, loc_78EA049314.&&.text:EA046A mov [r10+0D0h], rcx& && && && & //这里将被HOOK 15.&&.text:EA0471 mov [r10+0A0h], rbp16.&&.text:EA0478 mov [r10+98h], rsp17.&&.text:EA047F mov [r10+0F8h], r11& && && && &&&// saved return18.&&.text:EA0486 mov r12, 019.&&.text:EA048D xor r13, r1320.&&.text:EA0490 mov r14, rdx21.&&.text:EA049322.&&.text:EA0493 loc_78EA0493:23.&&.text:EA0493 mov r10, gs:14A0h24.&&.text:EA049C lea r10, [r10+10h]25.&&.text:EA04A0 mov r11, [r10+0D0h]& && && &&&// scheduler func26.&&.text:EA04A7 mov rcx, r1227.&&.text:EA04AA mov rdx, r1328.&&.text:EA04AD mov r8, r1429.&&.text:EA04B0 call r11& && && && && && && && && && && &&&// calls the scheduler function30.&&.text:EA04B3 lea rcx, [rsp+138h+var_38]31.&&.text:EA04BB movaps xmm6, [rsp+138h+var_108]32.&&.text:EA04C0 movaps xmm7, [rsp+138h+var_F8]如果我们调试内核,在Ntoskrnl.exe的KeBuildPrimaryThreadContext()函数处设置bp,我们可以看到0xEA0493被保存为返回到用户空间的地址。1.& & PAGE:FFFFF KeBuildPrimaryThreadContext2.& & PAGE:FFFFF3.& & PAGE:FFFFF arg_0 = qword ptr 84.& & PAGE:FFFFF arg_20 = qword ptr 28h5.& & PAGE:FFFFF arg_28 = qword ptr 30h6.& & PAGE:FFFFF7.& & PAGE:FFFFF mov [rsp+arg_0], rbx8.& & PAGE:FFFFF movsxd rbx, r9d9.& & PAGE:FFFFF mov r9, rdx10.&&PAGE:FFFFFB xor r10d, r10d11.&&PAGE:FFFFFE mov rax, [rcx+1B8h]12.&&PAGE:FFFFF mov r11, [rax]13.&&PAGE:FFFFF cmp r8, r1014.&&PAGE:FFFFFB jz loc_FFFFF15.&&[...]16.&&PAGE:FFFFF loc_FFFFF:17.&&PAGE:FFFFF mov rdx, [rdx+50h]18.&&PAGE:FFFFFC mov rcx, [r9+58h]19.&&PAGE:FFFFF mov rax, [r11+108h]20.&&PAGE:FFFFF mov [rdx+168h], rax& && && && && &// saved RIP21.&&PAGE:FFFFFE mov rax, [r11+0A8h]22.&&PAGE:FFFFF mov [rdx+180h], rax23.&&PAGE:FFFFFC mov rax, [r11+0B0h]24.&&PAGE:FFFFF mov [rdx+158h], rax25.&&PAGE:FFFFFA mov eax, 33 '3'26.&&PAGE:FFFFFF mov [rdx+170h], ax27.&&PAGE:FFFFFA6 mov eax, 2B '+'28.&&PAGE:FFFFFAB mov [rdx+188h], ax我们的想法是在ExecuteUmsThread()调用前破坏这个地址为非规范地址。而在用户态的scheduler中,返回地址保存在: GS:[0x14a0] + 0x10 + 0x1F处。内核调度结束后,ntoskrnl.exe中的KiUmsFastReturnToUser()函数被调用。在调用SYSRET指令前, RSP, RBP和GS将会被重置为他们之前保存的副本,返回用户态的地址也被移入RCX寄存器。1.& & .text:FFFFF0 KiUmsFastReturnToUser2.& & .text:FFFFF03.& & .text:FFFFF0 var_5046 = dword ptr -5046h4.& & .text:FFFFF0 var_4FA6 = byte ptr -4FA6h5.& & .text:FFFFF0 arg_42 = byte ptr 52h6.& & .text:FFFFF0 arg_80 = byte ptr 88h7.& & .text:FFFFF0 arg_190 = dword ptr 198h8.& & .text:FFFFF09.& & .text:FFFFF0 sub rsp, 28h10.&&.text:FFFFF4 mov rbx, gs:+188h11.&&.text:FFFFFD mov rcx, [rbx+1D8h]12.&&.text:FFFFF4 lea rbp, [rcx+80h]13.&&.text:FFFFFB mov rax, cr814.& & [...]15.&&.text:FFFFF6 loc_FFFFF6:16.&&.text:FFFFF6 mov r8, [rbp+100h]& && && && && && &// saved RSP17.&&.text:FFFFFD mov r9, [rbp+0D8h]& && && && && &&&// saved RBP18.&&.text:FFFFFA4 xor edx, edx19.&&.text:FFFFFA6 pxor xmm0, xmm020.&&.text:FFFFFAA pxor xmm1, xmm121.&&.text:FFFFFAE pxor xmm2, xmm222.&&.text:FFFFFB2 pxor xmm3, xmm323.&&.text:FFFFFB6 pxor xmm4, xmm424.&&.text:FFFFFBA pxor xmm5, xmm525.&&.text:FFFFFBE mov rcx, [rbp+0E8h]& && && && && &// saved ret address26.&&.text:FFFFFC5 mov r11, [rbp+0F8h]27.&&.text:FFFFFCC mov rbp, r928.&&.text:FFFFFCF mov rsp, r829.&&.text:FFFFFD2 swapgs& && && && && && && && && && && && &// switch GS to user30.&&.text:FFFFFD5 sysret31.&&.text:FFFFFD8 db 66h, 66h, 66h, 66h, 66h, 66h32.&&.text:FFFFFD8 nop word ptr [rax+rax+h]33.&&.text:FFFFFE7 db 66h, 66h, 66h, 66h, 66h, 66h但是,如果此时RCX是不规范的,那么GP异常将在特权模式下被抛出。3. Windows 7 & Windows 下的利用GP异常抛出时,RSP和RBP可控,GS指向用户态,PFH(protection fault handler)则被指向KiGeneralProtectionFault()函数一种利用此漏洞的方式,是利用已控的RBP和RBP。因为KiGeneralProtectionFault()将会把值写入堆栈,且堆栈也是可控的。基于这些我们可以试试write-4 techniques。ps: write-4 techniques - http://immunityinc.com/infiltrate/archives/kernelpool_infiltrate2011.pdf1.& & .text:FFFFF800028DBAC0 KiGeneralProtectionFault2.& & .text:FFFFF800028DBAC03.& & .text:FFFFF800028DBAC0 var_12D = byte ptr -12Dh4.& & .text:FFFFF800028DBAC0 var_12C = dword ptr -12Ch5.& & .text:FFFFF800028DBAC0 var_128 = qword ptr -128h6.& & .text:FFFFF800028DBAC0 var_120 = qword ptr -120h7.& & .text:FFFFF800028DBAC0 var_118 = qword ptr -118h8.& & .text:FFFFF800028DBAC0 var_110 = qword ptr -110h9.& & .text:FFFFF800028DBAC0 var_108 = qword ptr -108h10.&&.text:FFFFF800028DBAC0 var_100 = qword ptr -100h11.&&.text:FFFFF800028DBAC0 var_F8 = qword ptr -0F8h12.&&.text:FFFFF800028DBAC0 var_E8 = xmmword ptr -0E8h13.&&.text:FFFFF800028DBAC0 var_D8 = xmmword ptr -0D8h14.&&.text:FFFFF800028DBAC0 var_C8 = xmmword ptr -0C8h15.&&.text:FFFFF800028DBAC0 var_B8 = xmmword ptr -0B8h16.&&.text:FFFFF800028DBAC0 var_A8 = xmmword ptr -0A8h17.&&.text:FFFFF800028DBAC0 var_98 = xmmword ptr -98h18.&&.text:FFFFF800028DBAC0 var_58 = word ptr -58h19.&&.text:FFFFF800028DBAC0 arg_0 = qword ptr 10h20.&&.text:FFFFF800028DBAC0 arg_8 = byte ptr 18h21.&&.text:FFFFF800028DBAC0 arg_10 = qword ptr 20h22.&&.text:FFFFF800028DBAC0 arg_24 = dword ptr 34h23.&&.text:FFFFF800028DBAC024.&&.text:FFFFF0 push rbp25.&&.text:FFFFF1 sub rsp, 158h26.&&.text:FFFFF8 lea rbp, [rsp+80h]27.&&.text:FFFFF0 mov [rbp+0D8h+var_12D], 128.&&.text:FFFFF4 mov [rbp+0D8h+var_128], rax29.&&.text:FFFFF8 mov [rbp+0D8h+var_120], rcx30.&&.text:FFFFFC mov [rbp+0D8h+var_118], rdx31.&&.text:FFFFF0 mov [rbp+0D8h+var_110], r832.&&.text:FFFFF4 mov [rbp+0D8h+var_108], r933.&&.text:FFFFF8 mov [rbp+0D8h+var_100], r1034.&&.text:FFFFFC mov [rbp+0D8h+var_F8], r1135.&&.text:FFFFF0 test [rbp+0D8h+arg_8], 136.&&.text:FFFFF7 jz short loc_FFFFFA37.&&.text:FFFFF9 swapgs38.&&.text:FFFFFC mov r10, gs:188h39.&&.text:FFFFF5 test byte ptr [r10+3], 340.&&.text:FFFFFA mov [rbp+0D8h+var_58], 0然而,因为目标内存周围数据已被破坏,这使得此exp方法不可靠。一个更好的方法是利用指向用户空间的GS。我们的思路是,欺骗内核调用GS中索引的函数。这种功能可以触发页错误处理程序(所有这一切需要做的是产生此异常)。1.& & .text:FFFFFA cld2.& & .text:FFFFFB stmxcsr [rbp+0D8h+var_12C]3.& & .text:FFFFFF ldmxcsr dword ptr gs:180h4.& & .text:FFFFF8 movaps [rbp+0D8h+var_E8], xmm05.& & .text:FFFFFC movaps [rbp+0D8h+var_D8], xmm16.& & .text:FFFFF0 movaps [rbp+0D8h+var_C8], xmm27.& & .text:FFFFF4 movaps [rbp+0D8h+var_B8], xmm38.& & .text:FFFFF8 movaps [rbp+0D8h+var_A8], xmm49.& & .text:FFFFFC movaps [rbp+0D8h+var_98], xmm510.&&.text:FFFFF0 mov eax, [rbp+0E0h]11.&&.text:FFFFF6 test [rbp+0D8h+arg_10], 200h12.&&.text:FFFFF1 jz short loc_FFFFF413.&&.text:FFFFF3 sti14.&&.text:FFFFF4 loc_FFFFF4:15.&&.text:FFFFF4 mov r10, [rbp+0D8h+arg_0]16.&&.text:FFFFFB mov r9, cr417.&&.text:FFFFFF mov r8, cr018.&&.text:FFFFFA3 mov edx, 819.&&.text:FFFFFA8 mov ecx, 7Fh20.&&.text:FFFFFAD call KiBugCheckDisPatch此函数叫做 KeBugCheckEx()1.& & .text:FFFFF0 KiBugCheckDispatch2.& & .text:FFFFF03.& & .text:FFFFF0 var_118= qword ptr -118h4.& & .text:FFFFF0 var_108= xmmword ptr -108h5.& & .text:FFFFF0 var_F8= xmmword ptr -0F8h6.& & .text:FFFFF0 var_E8= xmmword ptr -0E8h7.& & .text:FFFFF0 var_D8= xmmword ptr -0D8h8.& & .text:FFFFF0 var_C8= xmmword ptr -0C8h9.& & .text:FFFFF0 var_38= byte ptr -38h10.&&.text:FFFFF011.&&.text:FFFFF0 sub rsp, 138h12.&&.text:FFFFF7 lea rax, [rsp+138h+var_38]13.&&.text:FFFFFF movaps [rsp+138h+var_108], xmm614.&&.text:FFFFF4 movaps [rsp+138h+var_F8], xmm715.&&.text:FFFFF9 movaps [rsp+138h+var_E8], xmm816.& & [...]17.&&.text:FFFFFD3 mov [rax+20h], r1318.&&.text:FFFFFD7 mov [rax+28h], r1419.&&.text:FFFFFDB mov [rax+30h], r1520.&&.text:FFFFFDF mov [rsp+138h+var_118], r1021.&&.text:FFFFFE4 call KeBugCheckEx22.&&.text:FFFFFE4 KiBugCheckDispatch endpKeBugCheckEx()函数需要将控制状态寄存器保存到GS索引的一个内存结构。1.& & .text:FFFFF800028DDC40 KeBugCheckEx2.& & .text:FFFFF800028DDC403.& & .text:FFFFF800028DDC40 var_18= qword ptr -18h4.& & .text:FFFFF800028DDC40 var_10= qword ptr -10h5.& & .text:FFFFF800028DDC40 var_8= qword ptr -86.& & .text:FFFFF800028DDC40 arg_0= qword ptr 87.& & .text:FFFFF800028DDC40 arg_8= qword ptr 10h8.& & .text:FFFFF800028DDC40 arg_10= qword ptr 18h9.& & .text:FFFFF800028DDC40 arg_18= qword ptr 20h10.&&.text:FFFFF800028DDC40 arg_20= qword ptr 28h11.&&.text:FFFFF800028DDC40 arg_28= byte ptr 30h12.&&.text:FFFFF800028DDC4013.&&.text:FFFFF800028DDC40 mov [rsp+arg_0], rcx14.&&.text:FFFFF800028DDC45 mov [rsp+arg_8], rdx15.&&.text:FFFFF800028DDC4A mov [rsp+arg_10], r816.&&.text:FFFFF800028DDC4F mov [rsp+arg_18], r917.&&.text:FFFFF800028DDC54 pushfq18.&&.text:FFFFF800028DDC55 sub rsp, 30h19.&&.text:FFFFF800028DDC59 cli20.&&.text:FFFFF800028DDC5A mov rcx, gs:20h21.&&.text:FFFFF800028DDC63 mov rcx, [rcx+4BD8h]22.&&.text:FFFFF800028DDC6A call RtlCaptureContext23.&&.text:FFFFF800028DDC6F mov rcx, gs:20h24.&&.text:FFFFF800028DDC78 add rcx, 40h25.&&.text:FFFFF800028DDC7C call KiSaveProcessorControlState26.&&.text:FFFFF800028DDC81 mov r10, gs:20h27.&&.text:FFFFF800028DDC8A mov r10, [r10+4BD8h]28.&&.text:FFFFF800028DDC91 mov rax, [rsp+38h+arg_0]29.&&.text:FFFFF800028DDC96 mov [r10+80h], rax30.&&.text:FFFFF800028DDC9D mov rax, [rsp+38h+var_8]KeSaveProcessorControlState()函数将尝试把cr0寄存器的内容保存在GS:0x20处。1.& & .text:FFFFF800028DDF70 KiSaveProcessorControlState2.& & .text:FFFFF800028DDF70 mov rax, cr03.& & .text:FFFFF800028DDF73 mov [rcx], rax4.& & .text:FFFFF800028DDF76 mov rax, cr25.& & .text:FFFFF800028DDF79 mov [rcx+8], rax6.& & .text:FFFFF800028DDF7D mov rax, cr37.& & .text:FFFFF800028DDF80 mov [rcx+10h], rax8.& & .text:FFFFF800028DDF84 mov rax, cr4这可以被用来抛出一个页错误:如果一个诸如0x45454的值被存储在GS:0x20,那么页错误将被触发。在页错误处理程序中,我们的目标在于达到KiCheckForKernelApcDelivery()函数。它主要包括设置一个有效的指针GS:0x188(初始设置为0)。1.& & .text:FFFFF800028DBC00 KiPageFault2.& & .text:FFFFF800028DBC003.& & .text:FFFFF800028DBC00 var_158= dword ptr -158h4.& & .text:FFFFF800028DBC00 var_138= dword ptr -138h5.& & .text:FFFFF800028DBC00 var_12E= byte ptr -12Eh6.& & .text:FFFFF800028DBC00 var_12D= byte ptr -12Dh7.& & .text:FFFFF800028DBC00 var_12C= dword ptr -12Ch8.& & .text:FFFFF800028DBC00 var_128= qword ptr -128h9.& && &[...]10.&&.text:FFFFF800028DBC00 push rbp11.&&.text:FFFFF800028DBC01 sub rsp, 158h12.&&.text:FFFFF800028DBC08 lea rbp, [rsp+80h]13.&&.text:FFFFF800028DBC10 mov [rbp+0D8h+var_12D], 114.&&.text:FFFFF800028DBC14 mov [rbp+0D8h+var_128], rax15.&&.text:FFFFF800028DBC18 mov [rbp+0D8h+var_120], rcx16.&&.text:FFFFF800028DBC1C mov [rbp+0D8h+var_118], rdx17.&&.text:FFFFF800028DBC20 mov [rbp+0D8h+var_110], r818.&&.text:FFFFF800028DBC24 mov [rbp+0D8h+var_108], r919.&&.text:FFFFF800028DBC28 mov [rbp+0D8h+var_100], r1020.&&.text:FFFFF800028DBC2C mov [rbp+0D8h+var_F8], r1121.&&.text:FFFFF800028DBC30 test byte ptr [rbp+0D8h+arg_8], 122.&&.text:FFFFF800028DBC37 jz short loc_FFFFF800028DBCAD23.&&.text:FFFFF800028DBC39 swapgs24.&&.text:FFFFF800028DBC3C mov r10, gs:188h25.&&.text:FFFFF800028DBC45 cmp [rbp+0D8h+arg_8], 33 '3'26.& & [...]27.&&.text:FFFFF800028DBCAD loc_FFFFF800028DBCAD:28.&&; KiPageFault+A6 j29.&&.text:FFFFF800028DBCAD cld30.&&.text:FFFFF800028DBCAE stmxcsr [rbp+0D8h+var_12C]31.&&.text:FFFFF800028DBCB2 ldmxcsr dword ptr gs:180h32.&&.text:FFFFF800028DBCBB movaps [rbp+0D8h+var_E8], xmm033.&&.text:FFFFF800028DBCBF movaps [rbp+0D8h+var_D8], xmm134.&&.text:FFFFF800028DBCC3 movaps [rbp+0D8h+var_C8], xmm235.&&.text:FFFFF800028DBCC7 movaps [rbp+0D8h+var_B8], xmm336.&&.text:FFFFF800028DBCCB movaps [rbp+0D8h+var_A8], xmm437.&&.text:FFFFF800028DBCCF movaps [rbp+0D8h+var_98], xmm538.&&.text:FFFFF800028DBCD3 mov eax, cs:KiCodePatchCycle39.&&.text:FFFFF800028DBCD9 mov [rbp+0D8h+arg_24], eax40.&&.text:FFFFF800028DBCDF mov eax, [rbp+0E0h]41.&&.text:FFFFF800028DBCE5 mov rcx, cr242.&&.text:FFFFF800028DBCE8 test [rbp+0D8h+arg_10], 200h43.&&.text:FFFFF800028DBCF3 jz short loc_FFFFF800028DBCF644.&&.text:FFFFF800028DBCF5 sti45.& & [...]46.&&.text:FFFFF800028DBCF6 loc_FFFFF800028DBCF6:47.&&.text:FFFFF800028DBCF6 mov r9, gs:188h48.&&.text:FFFFF800028DBCFF bt dword ptr [r9+4Ch], 0Bh49.&&.text:FFFFF800028DBD05 jnb short loc_FFFFF800028DBD1550.&&.text:FFFFF800028DBD07 test byte ptr [rbp+0F0h], 151.& & [...]52.&&.text:FFFFF800028EACF2 loc_FFFFF800028EACF2:53.&&.text:FFFFF800028EACF2 mov r12, gs:188h54.&&.text:FFFFF800028EACFB mov [rbp+0D0h+var_78], rdi55.&&.text:FFFFF800028EACFF mov rcx, [r12+70h]56.&&.text:FFFFF800028EAD04 mov [rbp+0D0h+var_98], rcx57.&&.text:FFFFF800028EAD08 cmp dword ptr [rcx+438h], 10h58.&&.text:FFFFF800028EAD0F lea r14, [rcx+398h]59.&&.text:FFFFF800028EAD16 ja loc_FFFFFE260.&&.text:FFFFF800028EAD1C mov eax, cs:MiDelayPageFaults61.&&.text:FFFFF800028EAD22 test eax, eax62.& & [...]63.&&.text:FFFFFC loc_FFFFFC:64.&&.text:FFFFFC call KiCheckForKernelApcDelivery65.&&.text:FFFFFA1 jmp loc_FFFFF800028EAF75KiCheckForKernelApcDelivery()函数调用的KiDeliverApc():1.& & .text:FFFFF KiCheckForKernelApcDelivery2.& & .text:FFFFF push rbx3.& & .text:FFFFF sub rsp, 20h4.& & .text:FFFFF mov rax, cr85.& & .text:FFFFFA mov ecx, 16.& & .text:FFFFFF test al, al7.& & .text:FFFFF jnz short loc_FFFFFF8.& & .text:FFFFF xor ebx, ebx9.& & .text:FFFFF mov cr8, rcx10.&&.text:FFFFF xor r8d, r8d11.&&.text:FFFFFC xor edx, edx12.&&.text:FFFFFE xor ecx, ecx13.&&.text:FFFFF call KiDeliverApc14.&&.text:FFFFF mov cr8, rbx这是一个实现代码执行的函数。它将提取GS:0x188中的指针,并在一系列解引用操作后设置R11寄存器,而R11寄存器用来调用另一个函数。1.& & .text:FFFFF0 KiDeliverApc2.& & .text:FFFFF03.& & .text:FFFFF0 var_78= dword ptr -78h4.& & .text:FFFFF0 var_58= qword ptr -58h5.& & .text:FFFFF0 var_50= qword ptr -50h6.& & .text:FFFFF0 var_48= qword ptr -48h7.& & .text:FFFFF0 var_40= qword ptr -40h8.& & .text:FFFFF0 arg_0= qword ptr 89.& && &[...]10.&&.text:FFFFFB loc_FFFFFB:11.&&.text:FFFFFB mov rbx, gs:188h12.&&.text:FFFFF4 mov r15, [rbx+1D8h]13.&&.text:FFFFFB mov r14, [rbx+70h]14.&&.text:FFFFFF mov [rbx+79h], r9b15.&&.text:FFFFF3 mov [rbx+1D8h], r816.&&.text:FFFFFA cmp [rbx+1C6h], r9w17.&&.text:FFFFF2 jnz short loc_FFFFFA818.&&.text:FFFFF4 lock or [rsp+78h+var_78], r9d19.&&.text:FFFFF9 lfence20.&&.text:FFFFFC lea rsi, [rbx+50h]21.& & [...]22.&&.text:FFFFFEC loc_FFFFFEC:23.&&.text:FFFFFEC mov r8, [rsi]24.&&.text:FFFFFEF cmp r8, rsi25.&&.text:FFFFFF2 jz loc_FFFFF26.&&.text:FFFFFF8 mov [rbx+79h], r9b27.&&.text:FFFFFFC lea r10, [r8-10h]28.&&.text:FFFFF0 prefetchw byte ptr [r10]29.&&.text:FFFFF4 mov rcx, [r10+30h]30.&&.text:FFFFF8 mov r11, [r10+20h]31.&&.text:FFFFFC mov [rsp+78h+arg_10], rcx32.&&.text:FFFFF4 mov rax, [r10+38h]33.& & [...]34.&&.text:FFFFFB0 loc_FFFFFB0:35.&&.text:FFFFFB0 mov rax, [r8+8]36.&&.text:FFFFFB4 mov rdx, [r8]37.&&.text:FFFFFB7 mov [rax], rdx38.&&.text:FFFFFBA mov [rdx+8], rax39.&&.text:FFFFFBE mov [r10+52h], r9b40.&&.text:FFFFFC2 lock and [rbx+88h], r941.&&.text:FFFFFCA movzx eax, r12b42.&&.text:FFFFFCE mov cr8, rax43.&&.text:FFFFFD2 lea rax, [rsp+78h+arg_18]44.&&.text:FFFFFDA lea r9, [rsp+78h+var_48]45.&&.text:FFFFFDF lea r8, [rsp+78h+var_40]46.&&.text:FFFFFE4 lea rdx, [rsp+78h+arg_10]47.&&.text:FFFFFEC mov rcx, r1048.&&.text:FFFFFEF mov [rsp+78h+var_58], rax49.&&.text:FFFFFF4 call r1150.&&.text:FFFFFF7 xor r9d, r9d51.&&.text:FFFFFFA jmp loc_FFFFF0而如果R11寄存器指向一个内核shellcode并且内核调用它,则我们的shellcode就能可靠运行了。下面我结合代码进行下简单的说明。上面说了一大通东西,其实关键就是1,&&挂钩特殊函数使其产生本无法产生的特殊非规范地址,并使指令跳到这个特殊非规范地址从而触发系统异常。2,&&系统发生异常时候,通过设置一些特定的数据跳转,跳转到我们想要的地方。也就是最关键的函数nt!KiDeliverApc,大家看代码的时候,需要结合标红的字段就可以理解SHELLCODE的布局了。触发这个异常的时候,gs:188指向的是我们分配的0地址,所以mov rbx, gs:188h&&rbx =0lea rsi, [rbx+50h]&&rsi =0x50mov r8, [rsi]& &r8 =0lea r10, [r8-10h] r10 = -10hmov r11, [r10+20h] r11 = 0x10call r11&&call的是我们分配地址0+0x10的地方。也就是代码里*(PLONGLONG)((ULONG_PTR)0L+0x10) =&&KernelShellcodeA的精华所在,其他的大家看代码也就清楚了。说明的是:原始的老外代码是VS2010 编译的,我修改为最常用的VS2008 编译,同时修改了些小BUG。代码调试可以调试到断点nt!KiUmsFastReturnToUserBreakpoint 5 hitnt!KiUmsFastReturnToUser+0x17e:fffff800`8b8de8000000&&mov& &&&rcx,qword ptr [rbp+0E8h] //构造的异常返回地址2: kd& pnt!KiUmsFastReturnToUser+0x185:fffff800`c8b9df8000000&&mov& &&&r11,qword ptr [rbp+0F8h]2: kd& pnt!KiUmsFastReturnToUser+0x18c:fffff800`8be9& && && & mov& &&&rbp,r92: kd& rrax=0000 rbx=fffffa800fa0fb60 rcx=0000(构造的异常返回地址)rdx=0000 rsi=f8edc0 rdi=0000rip=fffffc rsp=fffffbb0 rbp=fffffc60r8=ff6e0&&r9=ff6e0 r10=0000r11=1 r13=0001r14=f0iopl=0& && && &nv up di pl zr na po nccs=0010&&ss=0018&&ds=002b&&es=002b&&fs=0053&&gs=002b& && && && & efl=nt!KiUmsFastReturnToUser+0x18c:fffff800`8be9& && && & mov& &&&rbp,r9后面SYSRET 触发异常后,不能对在异常处理的代码下断点,否则会触发蓝屏。还有masm64New.rules文件拷贝到你的X:\Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults,X为你VC2008所在的盘。然后就可以调试即可。代码里面也比较简单1,&&不是WIN764 位就退出2,&&UMS函数初始化失败也退出。3,&&判断函数的参数,或者带PID,或者是EXE路劲,为了能使对应的程序为SYSTEM权限,及清除标志g_CiEnabled,从而可以安装加载非签名驱动,这2个是为了表明内核执行代码可能导致的危害性做的演示。4,&&分配0地址,并填入一些特殊数据,确保执行流程按指定的方向执行。5,&&设置好SHELLCODE,并将shellcode入口点填入地址0X10,从而使其被触发调用6,&&调用UMS线程,调用到我们的HOOK,填入非规范地址,从而触发异常执行。最后补充下,这段代码在WIN8 64位下应该是无效的,因为WIN8 64不允许分配0地址,也不允许内核执行应用空间的代码。
(20) 西西软件园提供好看的主题下载,主题包括开机登录画面,鼠标指针,声音等等方便不懂美化的童鞋使用。打开,里面有几个文件夹,若有两个,那么分别是和,选择和你系统版本或一样的文件夹,把里面的所有文件复制到替换即可。好像这个无法直接替换,也不能轻易替换,可以利用系统启动盘,启动到中去替换。这个文件夹里面就是主题文件,打开这个文件夹,把里面的文件和文件夹复制或者剪切到目录下。建议使用主题安装工具安装,看文件夹...
12-26 / 224KB
推荐理由:&Lion Skin Pack Win7模仿MAC套装主题,Lion Skin Pack主题包 包含了MAC主题,MAC开始菜单按钮,MAC D
05-15 / 5KB
推荐理由:微软之前曾提供了很多Windows 7主题包,其中就包括多个Bing主题包,但是此次微软提供了一个独特的Bing动态主
05-15 / 7.4M
推荐理由:win7美化大师属于系统美化软件,里面拥有很多的主题,而且分类明确鼠标指针图标 屏保 文件夹图标 壁纸 一
04-11 / 25.6M
推荐理由:win7仿mac主题 mLion7 更加的精致
11-04 / 30.6M
推荐理由:&Alienware是北美著名的整机厂商,Alienware的产品,均采用了当前最高端、顶级的配置,在业界是高端、
07-24 / 52.9M
推荐理由:Windows 8 UX Pack 为您提供您安装完整的操作系统,而不窥见到未来的Windows。它基本上是Windows 7的外观赋
05-0505-0204-2904-2404-2404-2404-2402-2202-1202-06
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载

我要回帖

更多关于 汇编语言入门 的文章

 

随机推荐