刚学pwn的小白,大家互相学习,看看哪里说得不对打在评论区!
这道题先把附件拿kali file一下,是64位的elf文件(相当于Windows exe)
直接执行一下,这里看别人的wp是可以通过输入构造字符串来getshell的,我这里就不这么做了,多练写脚本的能力
国际惯例checksec一下,64位小端序,未开启栈溢出保护和地址随机化,很明显这道题利用栈溢出了
拖入ida,shift+F12查看字符串,这里看到解题关键cat flag.txt指令,双击进去
点击command后按X再ok追踪到相关函数
offset command把后面当做命令指令
伪代码如下
双击主函数分析代码, read(0, &unk_601068, 0x10uLL)解读:第一个0是文件描述符,0
代表标准输入(stdin),即程序从键盘或管道接收输入的地方。 然后从指针&unk_601068指定的缓冲区里面读取最多16位数据(0x10uLL解读:0x代表十六进制,uLL=unsigned long long,无符号long long 型,10转为十进制即为16)
双击&unk_601068查看一下指向的存储空间,可以从偏移地址或四个db(dword byte)存储四个字节
连续地址接下来就是dword_60106C,通过刚才主函数分析,使这块存储的数据为1853186401即可调用函数执行命令得到flag
写脚本,下面两个略微差别
payload = b'a'*4 + p64(1853186401)和payload = 'a'*4 + p64(1853186401).decode("iso-8859-1")区别在于前者是全部以byte字节序列传输,后者不用b以及通过decode("iso-8859-1")转化为str进行传输
p.recvuntil("bof"):读取数据直到返回bof,bof代表缓冲区溢出发生,即我们攻击成功了
不懂脚本语句的可以看这篇文章pwntools常用脚本语句介绍讲解_recvuntil-CSDN博客
然后用Python跑一下拿到flag