什么是栈溢出和堆溢出?

请搞汇编的高人解答一下我的疑惑!谢谢!... 请搞汇编的高人解答一下我的疑惑!谢谢! 展开
 我来答
BlueWanderer
推荐于2017-11-28 · TA获得超过9210个赞
知道大有可为答主
回答量:5673
采纳率:83%
帮助的人:2112万
展开全部
所谓溢出广义上就是超出范围,整数就有溢出,比如8字节无符号整数是0到255

0 - 1就是下溢 255 + 1就是上溢

说正题

int f(int x)
{
int a[10];

a[11] = x;
}

这个就是栈溢出,x被写到了不应该写的地方。在特定编译模式下,这个x的内容就会覆盖f原来的返回地址。也就是原本应该返回到调用位置的f函数,返回到了x指向的位置。一般情况下程序会就此崩溃。但是如果x被有意指向一段恶意代码,这段恶意代码就会被执行。

堆溢出相对比较复杂,因为各种环境堆的实现都不完全相同。但是程序管理堆必须有额外的数据来标记堆的各种信息。堆内存如果发生上面那样的赋值的话就有可能破坏堆的逻辑结构。进而修改原本无法访问的数据。

int f(char *s, int n)
{
char a[10];

memcpy(a, s, n);

...
}

这个是栈溢出比较真实一点的例子,如果传入的数据长度大于10就会造成溢出,进而改变f的返回地址。只要事先在特定地址写入恶意代码,代码就会被执行。

堆溢出执行恶意代码的一种情况是通过过长的数据破坏堆结构,使下次申请能得到保存某些特定函数指针的位置,然后进行修改。

栈和堆溢出的一个共性就是第三方可以完全依靠提供特定数据实现代码级别的入侵。玩游戏的话可能知道PSP3000的破解,利用的就是PSP系统显示tiff文件时候的一个溢出漏洞。tiff文件内包含一段入侵代码,载入tiff文件的时候这段代码也会被载入,只不过这个时候各奔不可能被执行。但是tiff中的一部分数据是超长的,并且超长的部分包含了入侵代码的位置。当系统读取这部分数据的时候入侵代码就会被执行。
canlml
2018-04-05 · TA获得超过8022个赞
知道小有建树答主
回答量:43
采纳率:100%
帮助的人:1.6万
展开全部

栈溢出是由于C语言系列没有内置检查机制来确保复制到缓冲区的数据不得大于缓冲区的大小,因此当这个数据足够大的时候,将会溢出缓冲区的范围。

堆溢出的产生是由于过多的函数调用,导致调用堆栈无法容纳这些调用的返回地址,一般在递归中产生。堆溢出很可能由无限递归(Infinite recursion)产生,但也可能仅仅是过多的堆栈层级。

int f(int x)
{
int a[10];

a[11] = x;
}
这个就是栈溢出,x被写到了不应该写的地方。在特定编译模式下,这个x的内容就会覆盖f原来的返回地址。也就是原本应该返回到调用位置的f函数,返回到了x指向的位置。一般情况下程序会就此崩溃。但是如果x被有意指向一段恶意代码,这段恶意代码就会被执行。

堆溢出相对比较复杂,因为各种环境堆的实现都不完全相同。但是程序管理堆必须有额外的数据来标记堆的各种信息。堆内存如果发生上面那样的赋值的话就有可能破坏堆的逻辑结构。进而修改原本无法访问的数据。

int f(char *s, int n)

{

char a[10];

memcpy(a, s, n);

...

这个是栈溢出比较真实一点的例子,如果传入的数据长度大于10就会造成溢出,进而改变f的返回地址。只要事先在特定地址写入恶意代码,代码就会被执行。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gecdg18
2010-11-27 · TA获得超过329个赞
知道小有建树答主
回答量:466
采纳率:0%
帮助的人:378万
展开全部
什么是能校时?自动校时?

STRT EQU P2.6
STP EQU P2.7
CLRR EQU P3.0
SEC EQU P3.5
MIN EQU P3.6
HOUR EQU P3.7

ORG 00H
SJMP MAIN
ORG 0BH
AJMP T0INT0
ORG 30H

MAIN: MOV SP,#60H
MOV R4,#20
MOV TMOD,#01H
MOV TH0,#03CH;#9EH 12M晶振时定时初值取#3CB0H
MOV TL0,#0B0H;#58H
SETB ET0
SETB EA
;MOV 28H,#12

kS: LCALL DISP
JB SEC,KM
LCALL DISP
JNB SEC,$-3
AJMP SINC

kM: JB MIN,KH
LCALL DISP
JNB MIN,$-3
AJMP MINC

KH: JB HOUR,K1
LCALL DISP
JNB HOUR,$-3
AJMP HINC

SINC: INC 26H
MOV A,26H
CJNE A,#60,SINC0
MOV 26H,#0
SINC0: AJMP KS

MINC: INC 27H
MOV A,27H
CJNE A,#60,MINC0
MOV 27H,#0
MINC0: AJMP KM

HINC: INC 28H
MOV A,28H
CJNE A,#24,HINC0
MOV 28H,#0
HINC0: AJMP KH

k1: LCALL DISP
JB STRT,K2
LCALL DISP
JNB STRT,$-3
AJMP START

k2: JB STP,K3
LCALL DISP
JNB STP,STOP
K3: JB CLRR,KS
LCALL DISP
JNB CLRR,CLEAR
AJMP KS

START: SETB TR0
AJMP K1

STOP: CLR TR0
AJMP K2

CLEAR: CLR TR0
MOV A,#0
MOV 20H,A
MOV 21H,A
MOV 22H,A
MOV 23H,A
MOV 24H,A
MOV 25H,A
MOV 26H,A
AJMP KS

DISP:
MOV A,26H
MOV B,#10
DIV AB
MOV 20H,B ;余数(秒个位数)
MOV 21H,A ;商(秒十位数)
MOV A,27H
MOV B,#10
DIV AB
MOV 22H,B ;余数(分个位数)
MOV 23H,A ;商(分十位数)
MOV A,28H
MOV B,#10
DIV AB
MOV 24H,B ;余数(时个位数)
MOV 25H,A ;商(时十位数)
MOV A,20H ;秒个位
ACALL SEG7
MOV P0,A
CLR P2.0
ACALL DLY
SETB P2.0
MOV A,21H ;秒十位
ACALL SEG7
MOV P0,A
CLR P2.1
ACALL DLY
SETB P2.1
MOV A,22H ;分个位
ACALL SEG7
MOV P0,A
SETB P0.7
CLR P2.2
ACALL DLY
SETB P2.2
MOV A,23H ;分十位
ACALL SEG7
MOV P0,A
CLR P2.3
ACALL DLY
SETB P2.3
MOV A,24H ;时个位
ACALL SEG7
MOV P0,A
SETB P0.7
CLR P2.4
ACALL DLY
SETB P2.4
MOV A,25H ;时十位
ACALL SEG7
MOV P0,A
CLR P2.5
ACALL DLY
SETB P2.5
RET

T0INT0: MOV TH0,#03CH;#9EH ;定时中断子程序。重装定时常数
MOV TL0,#0B0H;#58H
DJNZ R4,T0INTR ;50msX20=1S,未满20次,跳出中断子程序
MOV R4,#20

INC 26H
MOV A,26H
CJNE A,#60,T0INTR
MOV 26H,#0
INC 27H
MOV A,27H
CJNE A,#60,T0INTR
MOV 27H,#0
INC 28H
MOV A,28H
CJNE A,#24,T0INTR
MOV 28H,#0
AJMP T0INTR

T0INTR: RETI

DLY10: MOV R3,#30
D0: ACALL DLY
DJNZ R3,D0
RET
DLY: MOV R7,#2
D1: MOV R6,#40
DJNZ R6,$
DJNZ R7,D1
RET

SEG7: INC A
MOVC A,@A+PC
RET

DB 03FH ;0
DB 006H ;1
DB 05BH ;2
DB 04FH ;3
DB 066H ;4
DB 06DH ;5
DB 07DH ;6
DB 007H ;7
DB 07FH ;8
DB 06FH ;9

END
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yunfuyiyu
2010-11-25
知道答主
回答量:10
采纳率:0%
帮助的人:0
展开全部
因为Intel指令没有对寄存器FFFF变到0进行检测的功能。所以,当寄存器作为指针,像SP,就会从最后蹦到0去。对于其他大小的也一样,没有检测。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式