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环境变量的问题:
 
 
 
 
 
 





转载于:https://www.cnblogs.com/ydfr/p/3204142.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值