一开始特别懵的一道题。
题目功能
题目逻辑比较简单,大概增加和删除和打印三个功能:
show函数中,打印各日记内容,由于这题没有给出libc文件,应该不需要泄露地址,估计用处不大:
delete函数中,正常的free,然后指针修改为null,可能不存在漏洞,唯一的bug在于read_int()函数中
readint函数使用了atoi函数,当输入是“-12”这样的负数时,造成读越界,但是由于在delete函数中,用处不是特别大
最后,add函数
函数的逻辑是在note数组中写入malloc的返回的指针,并且同样用了readint函数,可以发现存在越界写的问题,而note变量在bss段上,可以想到覆写got表:
漏洞利用
检查一下文件开启的保护,没有开启NX保护,也就是可以写入shellcode,这样put@got指向malloc返回地址,malloc块中写入shellcode,便可以获得shell。
而针对用户输入,还有一个函数用来检测,
因此需要保证用户输入范围是从2F~7F范围内。即考察shellcode的编写。
常见的shellcode思路是利用int 80h陷入软中断,
并使得eax内容为0x0b,ebx指向一个字符串”/bin/sh”,ecx、edx置0。如shellcraft.sh()
1 | /* execve(path='/bin///sh', argv=['sh'], envp=0) */ |
但在汇编以后,不能满足我们的要求。
根据某师傅博客中写到,此题可用的汇编指令如下:
1 | 1.数据传送: |
可以先看一下,执行shellcode时的寄存器状况:
根据如上的寄存器情况,shellcode可以写成这样:
1 | shellcode = ''' |
EXP
1 | from pwn import * |