Assembly 使用scanf进行缓冲区溢出练习?
我正在解决我们大学的一个旧考试,需要以下问题的帮助: 在32位Linux系统上。我们有一个程序集,其中调用了Assembly 使用scanf进行缓冲区溢出练习?,assembly,buffer,overflow,scanf,Assembly,Buffer,Overflow,Scanf,我正在解决我们大学的一个旧考试,需要以下问题的帮助: 在32位Linux系统上。我们有一个程序集,其中调用了scanf(),我们希望实现缓冲区溢出 现在在解决方案中,这意味着,如果我们提供12字节/字符的输入,以覆盖返回地址就足够了。 然而,%ebx寄存器存储缓冲区的地址(我认为…)。 我的问题是,%ebx=%ebp-8意味着我们需要16字节来覆盖返回地址(因为8字节缓冲区+4字节旧ebp+4字节返回地址) 在练习的描述中写到,缓冲区只有4字节长 以下是练习: pushl %ebp
scanf()
,我们希望实现缓冲区溢出
现在在解决方案中,这意味着,如果我们提供12字节/字符的输入,以覆盖返回地址就足够了。
然而,%ebx
寄存器存储缓冲区的地址(我认为…)。
我的问题是,%ebx=%ebp-8
意味着我们需要16字节来覆盖返回地址(因为8字节缓冲区+4字节旧ebp+4字节返回地址)
在练习的描述中写到,缓冲区只有4字节长
以下是练习:
pushl %ebp
movl %esp,%ebp
subl $0x10,%esp
pushl %esi
pushl %ebx
xorl %esi,%esi
leal 0xfffffff8(%ebp),%ebx
addl $0xfffffff8,%esp
pushl %ebx
pushl $0x8048680
call 8048434 <_init+0x74> # call scanf
pushl%ebp
移动%esp,%ebp
子目录$0x10,%esp
pushl%esi
推送%ebx
xorl%esi,%esi
leal 0xFFFFF8(%ebp),%ebx
添加$0xfffffff8,%esp
推送%ebx
pushl$0x8048680
致电8048434#致电scanf
缓冲区溢出
本身并不一定意味着覆盖返回地址,因此是的,12个字节会溢出缓冲区并覆盖旧的ebp
(当然9个字节就足够了)。但不幸的是,这个练习的解决方案告诉我们,这12个字节也足以覆盖返回地址…假设它是一个字符串,输入12个字节会将零终止符放在第13个字节中,这至少会覆盖部分返回地址。这是不可能的,因为练习说我们要返回地址0x8048571,而不是0x804856b