Pwnable.tw dubblesort-hacknote-silver_bullet



dubblesort

32bit Binary 保护全开 冒泡排序

如同题目”冒泡排序”,题目确实一个排序的程序,也是我们常见的\(O^2\)复杂度的一个冒泡排序算法,最后排序的结果由小至大排列
由于题目中保护全开,首先需要泄露地址
题目中的漏洞主要有两处
第一处main函数中输入name时的堆栈未初始化漏洞

由于buf栈空间没有memset,所以可以利用此漏洞泄露地址

第二处也是容易发现的漏洞,就是没有控制输入的数字的个数,造成stack overflow

输入的排序的数字都储存在v4中,不断向下增长,而题目中又没有控制total的大小,所以可以无限向下写,从而造成溢出
在程序的主逻辑sort函数中
采用双循环实现了dubblesort,并且是在对main函数中开辟的数字的内存操作,进行从小到大的排序

首先,利用堆栈初始化漏洞泄露地址,泄露libc地址

name中填入0x1c,在hello打印时,可泄露出libc地址
通过libc基地址可计算出one_gadget,libc_system“/bin/sh”的地址

之后,考虑ret2libc

when we input + to scanf(“%u”, &n) the value in n will not change

scanf(“%d”,&a)在输入”+“时不会写入a中,并且保留a的值,我们可以这一点Bypass canary检查,直接ret2libc

最后,注意几点:

  • 注意程序会对内存进行排序,尽量保证填入的数字从小到大
  • scanf(”%d”,&a)是输入”+“,实际内存中的值是Canary,使得Canary参与数字排序
  • one_gadget不能成功,因为esi寄存器的值不满足条件
  • system与binsh_addr的值一般会大于Canary,所以不必担心排序打乱顺序

hacknote

题目是典型的选单程序,利用UAF可以Getshell

题目是一个逻辑比较清楚的选单程序,有add,delete,print,exit四种操作
1. add操作首先malloc(8)建立一个note的管理结构,之后利用该8byte,前4byte存储如下函数地址:

后4个byte储存通过malloc(size)得到的函数地址,其中size是用户可指定的大小,无限制
2. delete操作通过free掉index指定的note的内容与管理结构,但是在free之后没有将指针置空,可能造成Use after free。

3. print函数通过index调用note管理结构中自身的函数指针,打印note的内容

因为题目的开启了FULL RELRO,攻击GOT表的不现实,我们能够利用的应该是note中的函数指针
我们可利用的就是use after free的漏洞,利用uaf的基本思路就是使用我们可控的content重用一个note的管理结构:

  • 建立一个smallbin,释放后进入到unsortedbin
  • 再建立一个note 使用unsotedbin,并打印,泄露libc地址
  • 根据libc地址与题目提供的libc计算出system地址
  • 释放之前smallbin大小的note,在fastbinY[0]中留下一个管理结构,建立一个大小同样为8的note,并释放,此时FastbinY的内容如下:

  • 再次建立一个content大小为8的note,即可复用1的note 的管理结构,打印1即可trigger system
  • 注意我们使用print是,调用情况如下:

我们虽然能够修改ptr的前四个字节为system的地址,但是无法控制执行system的第一个参数,但这里有一个magic,我们可以使用shell命令分隔符;,先执行system(“&system”),再执行system(";sh;")相当于执行system(“sh”),既能够顺利Getshell。

silver_bullet

题目是简单的选单程序,逻辑相对也比较简单,主要目的是建立一个silver bullet去攻击并杀死werewolf即可取得胜利

在create_silver中可以建立一个description小于0x30的silver bullet,它的攻击力即description的长度

powerup操作可以帮助我们提升silver的攻击力,漏洞也出现在此
通过strnact增加description,但是silver的攻击力却赋值错误

*((_DWORD *)dest + 12) = v3;silver攻击力被赋值为第2次增加的长度,试想:我们第一次powerup,增加1 byte长度,此时
*((_DWORD )dest + 12)被赋值为1,我们第二次Powerup即可造成栈溢出,覆盖*((_DWORD )dest + 12)劫持程序控制流
werewolf的hp为:

我们通过第二次powerup溢出修改*((_DWORD )dest + 12)>0x7FFFFFFF,通过beat胜利程序返回进行ROP,即可顺利Spavn shell

发表评论