我正在解决我们大学的旧考试,需要帮助解决以下问题:
在32位Linux系统上。我们有这个程序集,其中scanf()
被调用,我们想要实现缓冲区溢出。
现在在解决方案中意味着,如果我们提供12byte / char输入就足够了,以便覆盖返回地址。
但是%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