1.打开靶机,下载文件,检查文件类型,32位ELF,NX机制打开,栈区Canary保护开启,栈溢出无法执行,用ida编译,发现printf函数,考虑格式化字符串漏洞。2.主要信息在19到29行,用AI分析代码,大体意思是从文件中读取4个字节的数据到
unk_804C044
变量中,作为用户名name,之后输出提示信息"your passwd:",再输入密码,并与unk_804C044
进行比较,如果两者相等,执行system("/bin/sh")
命令,进入system函数,达到我们控制目的。
3.利用格式化字符串漏洞,我们在终端上运行该函数,输入./pwn,回车,为确定格式化字符串与实际运行的函数的距离(即偏移量)再输入AAAA.%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x,显示如下图,因为A为字符数据,%x为格式化输出十六进制的数据,转化为A的ASCⅡ代码是65,十六进制下为0x41,四个A即为0x41414141,数一下离我们输入的AAAA有十个数据,则说明偏移量是10。
4.这样编写脚本的时候就注意,在对应存入的地址栈前10个位置(unk_804C044的真实运行地址)
填入数据,在ida里看是存入长度为4个字节的数据作为用户名,再后来输入密码passwd,也用相同的方式填入长度为4个字节数的数据,进入system,得到控制权。
5.io.recvuntil()在pwn库中含义为从字节流中读取数据直到遇到后面括号里的数据停止,(第一个:即为name:后要输入的4字节长度,第二个:即为passwd:后输入的密码)在脚本相应的位置写入它们,停止读取后紧跟我们写入sendline的payload进行编译。最后交互数据,得到flag。