protostar_stack6

 
这段程序程序要求调用getpath函数但是 调用者的地址不能以0xbf开头!
ret表示返回地址。
__builtin_return_address(0)的含义是,得到当前函数返回地址,即此函数被别的函数调用,然后此函数执行完毕后,返回,所谓返回地址就是那时候的地址。
这个函数是gcc在linux下的特性,建议看这个文章,讲述的异常清晰:
 
objdump 一下目标文件:
 
 
 
buffer = esp + 28 = ebp -76
返回地址 = buffer + 80
现在,我们的目的是让shellcode可以正常执行的同时,让返回地址开头不是bf,这个很难办,因为BF什么的,是栈中的地址,我们能够利用的主要是栈中的东西,无论是把ret重定位的什么地址,基本都是栈中的内容。
什么东西不在栈中呢?
一些库函数不在栈中!    下面是关于ret2libc的介绍:


ret2libc
ret2libc , Return to libc    返回到c库
libc is the C standard shared library programs are linked against. It contains every-day use functions such as printf, strlen, strcpy, and so on.There is the one function that will be of special use to use: system(). The system() function only takes one argument, a pointer to a string containing the path and name of the program we want to execute; pretty straight.
现在问题是如何找到“/bin/sh”这个字符串,在内存中
有两种方式:1. 在程序的输入的地方加入 相应的字符串
                     2. 在环境变量中加入 相应的字符串
 
而栈的形态,应该是这样子的:
 
这个低地址和高地址是反过来的。
如果高在上的话,我粗略的画了一个图,是这样的:
 
 

首先查看system,exit函数的地址:
 
stack6程序,gdb调试,在esp处  x/1000s $esp 找到 /bin/sh字符串的位置0xbfffffba
 
 
所以我们利用:
 
perl -e 'print "a"x80 . "\xb0\xff\xec\xb7" . "\xc0\x60\xec\xb7" . "\xba\xff\xff\xbf" ' | ./stack6
但是这种方式不行!
我一直不明白为什么,直到看了这个:
它的解释是 system("/bin/sh") not working because bash drops priviledges (man bash)
 
好吧,先说能行的方法:
还是利用之前的shell code :
把它编译成目标文件,然后利用之前的方法,只是把字符串 "/bin/sh"的地址 换成 目标文件的目录的字符串的地址!
 
 
 
perl -e 'print "a"x80 . "\xb0\xff\xec\xb7" . "\xc0\x60\xec\xb7" . "\xc5\xff\xff\xbf" ' | ./stack6
 
发现不行,进行适当的调整:终于可以了!
 
 
关于linux环境变量的问题:
 
 
 
 
 
 





posted @ 2013-07-21 19:23  二哥拉手网  阅读(334)  评论(0编辑  收藏  举报