Assembly 使用scanf进行缓冲区溢出练习?

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

我正在解决我们大学的一个旧考试,需要以下问题的帮助:

在32位Linux系统上。我们有一个程序集,其中调用了
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