摘要: 推荐文档:http://crypto.stanford.edu/cs155/papers/formatstring-1.2.pdf格式化字符串漏洞,出现于2000年左右,格式化字符串漏洞总之就是利用c语言中的printf一类函数的“格式输出”的漏洞。printf(string); 和 printf("%s",string);是不一样的!常见的格式函数有:等等。格式化字符串除了可以用%来表示,也可以通过\x25来表示,因为\是转义字符。比如:printf ("The magic number is: \x25d\n",23);然后文中举例,说格式化字符串漏 阅读全文
posted @ 2013-08-08 11:18 二哥拉手网 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 这个初看和上一题没啥区别,仔细一看,我了个去,target == 0x01025544,总不能构造一个这么长的字符串吧!而且,buffer的长度只有512~看了只有分段覆写了!target的位置是:0x080496f4target作为一个整数,占4个字节, f4,f5,f6,f7为了能“配”出相应的长度,需要%数字x来实现,所以需要在地址中间加入4字节的信息,来作为%数字x的输出,然%n作用在地址上面,就算长度超过255也无所谓,我们只关心255以下的内容!经过多次调试:来自为知笔记(Wiz) 阅读全文
posted @ 2013-08-08 11:18 二哥拉手网 阅读(123) 评论(0) 推荐(0) 编辑
摘要: ·这次是要重定向到hello函数,buffer有512长度,但是用了 fgets(buffer,sizeof(buffer),stdin)这样的输入方式,想要溢出攻击有一些困难(有长度限制啊),至少比之前的用gets函数的难(gets函数什么的,太弱了)hello函数的地址:080484b4我们注意到了,这里面vuln函数在结束的时候用了exit(1),exit函数是进程级别的退出,而不是return语句(return是函数级别的退出)return可以用覆盖返回地址来攻击,但是exit就很难,我们,只能覆盖exit函数的说~就是把exit(1)这个语句,重定位到hello函数上!ex 阅读全文
posted @ 2013-08-08 11:17 二哥拉手网 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 这个和stack练习没啥区别:来自为知笔记(Wiz) 阅读全文
posted @ 2013-08-05 21:55 二哥拉手网 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 我们objdump试一下这个目标文件:所以,target的位置是:0x08049638我们要改变这个内存的地址!printf函数中有%n这一格式,把输出的字符串长度放到一个内存中!这一段程序的运行结果是len的值被赋成11.回到本level,在调用printf函数之前,作为参数,char * string 已经存在栈中了,它指向了main函数的第一个参数的位置!所以,这个字符串也在栈中,而且在高地址!而如果我们在string是 “%x",那么就会把printf函数参数上面的4个字节按照%x的方式打印出来,如果再加上一个%x,又会打印一个!所以:我们看中间有两个 eeeeee00 2e 阅读全文
posted @ 2013-08-05 21:54 二哥拉手网 阅读(376) 评论(0) 推荐(0) 编辑
摘要: protostar 是 http://exploit-exercises.com网站上关于Network,Stack overflows,Format strings,Heap overflows的练习。stack部分,有8个levelstack overflows部分,最核心的,就是通过缓冲区的溢出,覆盖函数的返回地址返回地址可以被重定位到很多地方:缓冲区中,缓冲区溢出的地方,通过libc函数进行重地位,通过代码段的冲定位等等。栈溢出攻击的防护措施有很多:stack canariescanary的意思是金丝雀,在煤矿中,人们用金丝雀来判断是否有有害的气体。在处理栈溢出的问题上,在程序起始的时 阅读全文
posted @ 2013-07-23 18:05 二哥拉手网 阅读(711) 评论(0) 推荐(0) 编辑
摘要: 这一次的代码如上所示 ----这一次和之前的不同在于:1. 有返回值,是strdup(buffer) 函数的返回值~2. 0xbf 变为 0xb0了~strdup函数的返回值是新申请的内存的地址,4字节,应该存放在eax上。接下来,返回的时候,会执行返回地址所指向的语句,这个语句的位置不能是0b开头的,不能是栈里的东西,同时,也不能是libc里的函数,它们是0b7开头的!提示中说,可以return to .text段,那么可以这样:buffer里写入shell code,在返回地址的位置,找到一个call eax的命令的地址。在代码段中:有两处call *%eax0x080484bf0x080 阅读全文
posted @ 2013-07-22 23:42 二哥拉手网 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 这段程序程序要求调用getpath函数但是 调用者的地址不能以0xbf开头!ret表示返回地址。__builtin_return_address(0)的含义是,得到当前函数返回地址,即此函数被别的函数调用,然后此函数执行完毕后,返回,所谓返回地址就是那时候的地址。这个函数是gcc在linux下的特性,建议看这个文章,讲述的异常清晰:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/objdump 一下目标文件:buffer = esp + 28 = ebp -76返回地址 = buffer + 80现在,我们的目的是让shellcod 阅读全文
posted @ 2013-07-21 19:23 二哥拉手网 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 这次的练习很难,要真正的实现一个shellcode那么我们先来了解一下最简单的shellcode:这个运行的结果是在shell中产生一个新的shell。和以往一样,首先查看目标文件的内容,main函数部分:gdb调试,在main处设置断点,查看断点的信息:我们发现:esp 0xbffffcd0ebp 0xbffffd28 = esp + 88buffer esp + 16我们把那个最简单的shellcode反汇编之后的结果加进去!但是这个产生了段错误!经过查阅资料,我了解到产生段错误的原因是由于gdb中调试的栈,和真实运行的栈的位置,不一定相同!!https://code.google.com 阅读全文
posted @ 2013-07-14 16:22 二哥拉手网 阅读(527) 评论(0) 推荐(0) 编辑
摘要: 这一次的练习是上一次的延续:上一次是在main中显式的调用了一个函数指针指的函数,我们覆盖了那个函数指针,于是得到了相应的结果,这次有所不同,这次没有显示的调用,只能覆盖main函数的返回地址。函数调用的时候(x86体系结构),过程是先是从右向左压入参数,然后压入返回地址;进入被调用者的代码部分,压入ebp,把esp赋给ebp,esp减去某个值(这段空间来放局部变量)。这是win和main的反汇编:win的地址是0x080483f4main中esp给局部变量留下的空间是 0x50 = 80main的地址是0x08048408main函数是在这里被调用的:其中有一句:push $0x804084 阅读全文
posted @ 2013-07-10 10:30 二哥拉手网 阅读(285) 评论(0) 推荐(0) 编辑