【问题标题】:exploit bufferoverflow shellcode利用 bufferoverflow shellcode
【发布时间】:2015-02-06 09:25:39
【问题描述】:

我有一些关于缓冲区溢出的作业。

int func1(char *str) { 
    char buffer[400];
    strcpy(buffer,str);
    printf("%s\n", buffer);
}

int main(int argc, char *argv[]) {
    func1(argv[1]);
}

这是我的 bufferoverflow.c,我也有 shellcode.txt

\xeb\x16\x5e\x31\xd2\x52\x56\x89\xe1\x89\xf3\x31\xc0\xb0\x0b\xcd\x80\x31\xdb\x31\xc0\x40\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68

目标是使用bufferoverflow获取root权限。 但是,我不知道具体该怎么做。
关于 main 和 func1 函数,我使用“gdb”和 disas。
然而,汇编代码并没有给我很多信息。

函数 main 的汇编代码转储:

0x08048422 <+0>:    push   %ebp
0x08048423 <+1>:    mov    %esp,%ebp
0x08048425 <+3>:    and    $0xfffffff0,%esp
0x08048428 <+6>:    sub    $0x10,%esp
0x0804842b <+9>:    mov    0xc(%ebp),%eax
0x0804842e <+12>:   add    $0x4,%eax
0x08048431 <+15>:   mov    (%eax),%eax
0x08048433 <+17>:   mov    %eax,(%esp)
0x08048436 <+20>:   call   0x80483f4 <func1>
0x0804843b <+25>:   leave  
0x0804843c <+26>:   ret

函数 func1 的汇编代码转储:

0x080483f4 <+0>:    push   %ebp
0x080483f5 <+1>:    mov    %esp,%ebp
0x080483f7 <+3>:    sub    $0x1a8,%esp
0x080483fd <+9>:    mov    0x8(%ebp),%eax
0x08048400 <+12>:   mov    %eax,0x4(%esp)
0x08048404 <+16>:   lea    -0x198(%ebp),%eax
0x0804840a <+22>:   mov    %eax,(%esp)
0x0804840d <+25>:   call   0x8048314 <strcpy@plt>
0x08048412 <+30>:   lea    -0x198(%ebp),%eax
0x08048418 <+36>:   mov    %eax,(%esp)
0x0804841b <+39>:   call   0x8048324 <puts@plt>
0x08048420 <+44>:   leave  
0x08048421 <+45>:   ret    

【问题讨论】:

    标签: linux assembly x86 shellcode


    【解决方案1】:

    您是否填充了缓冲区和 SFP?

    Bof(Buffer overflow) 攻击必须是重载buf, sfp 然后你输入shellcode地址

    显示堆栈帧 缓冲区 | SFP | RET(返回地址)

    目的是控制RET

    所以你可以通过多种方式进行攻击

    首先,在buf中输入shellcode,用gdb找到buf地址,然后填充剩余的buf,SFP最后在RET上输入buf地址(shellcode)

    其次,使用环境变量(shellcode)获取地址脚本然后填充buf,SFP最后在RET上输入环境变量地址

    要先攻击才能成功,必须关掉ASLR、DEP

    第二次攻击也必须脱离 ASLR

    进入终端

    echo 0 > /proc/sys/kernel/randomize_va_space : ASLR OFF
    -fno-stack-protector -z execstack -mpreferred-stack-boundary=2 -m32 : gcc compile option no dummy buf and no DEP protect and compile to 32bit binary
    

    【讨论】:

      【解决方案2】:
      1. 查看是否启用了 ASLR、堆栈 cookie 或可执行堆栈。

      如果 ASLR 关闭,堆栈 cookie 关闭,NX 开启 您可以尝试将 EIP 替换为指向系统调用的地址

      如果 ASLR 开启且 NX 开启 您可能不得不泄露地址或使用 ROP 来获取 root shell。

      【讨论】:

        【解决方案3】:

        如果你想挂载缓冲区溢出攻击。 首先,你必须找到一些方法来颠覆易受攻击的程序的控制流程,使其脱离正常进程,并且 其次,您必须使程序以您选择的方式运行。

        在您的情况下, func1 的缓冲区容量为 400 个字符,并且它不检查输入的边界。因此,您可以发送超过 400 个字符,并以您的方式覆盖堆栈中 func1 的返回地址。

        您可以使用传统的堆栈粉碎攻击来实现第二个目的。那就是将代码注入 func1 并且堆栈上修改后的返回地址指向此代码。 然而,大多数现代架构和操作系统提供的 DEP 经常可以防御堆栈粉碎攻击。

        最有效的方法是使用 ROP 攻击。 ROP 攻击不会在目标程序中注入代码。它会找到您系统中已经存在的一些小工具(例如 libc),然后将这些小工具链接在一起以完成攻击(在您的情况下获得 root 权限)。 ROP shellcode 由这些小工具的地址和一些数据组成。 我不检查你的 shell 代码是否是 ROP shellcode。

        有关 ROP 的更多详细信息: [1] 面向返回的编程:系统、语言和应用程序 [2] 面向回报的编程。 http://en.wikipedia.org/wiki/Return-oriented_programming

        【讨论】:

          猜你喜欢
          • 2011-10-21
          • 2013-02-03
          • 2018-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多