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 :
还是利用之前的shell code :
把它编译成目标文件,然后利用之前的方法,只是把字符串 "/bin/sh"的地址 换成 目标文件的目录的字符串的地址!
perl -e 'print "a"x80 . "\xb0\xff\xec\xb7" . "\xc0\x60\xec\xb7" . "\xc5\xff\xff\xbf" ' | ./stack6
发现不行,进行适当的调整:终于可以了!
关于linux环境变量的问题: