当前位置:网站首页 > 技术博客 > 正文

第五空间哪一集最精彩



例行检查,32位,开启了canary保护和NX保护。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行一下。
在这里插入图片描述
IDA打开,看到了/bin/sh,但开启了保护
在这里插入图片描述
查看主函数,函数的功能是读入一个4位的随机密码,再将我们输入的密码与随机生成数比较,相同就执行system
在这里插入图片描述
这里面的printf()存在格式化字符串漏洞
按我的理解就是输入的参数的个数是不固定的,是由前面的格式化字符串决定的,所以我们只要控制了前面的格式化字符串,再结合一些参数,后面输出什么就是由我们决定的;如:
%d 用于读取10进制数值
%x 用于读取16进制数值   
%s 用于读取字符串值   
%n 用于读取前面字符串的长度并写入某个内存地址














在这里插入图片描述
%$定位参数符
简单来説 就是一个偏移量
在这里插入图片描述


1.利用 "AAAA %08x %08x %8x %08x %08x %08x %08x………… ",这样的字符串来找到我们输入的参数在函数栈上的位置,我看别的师傅叫首地址偏移或者偏移量

2.假设是在栈上第n位,那么可以利用 %n$ 定位到参数在栈上的位置

3.利用%n来修改参数里的内容,我们不知道读入的随机数是多少,那么我们将它改成我们写入的数据不就好了

首先我们要定位到我们输入的字符串在栈上的位置。
在这里插入图片描述
我们输入的参数是在栈上的第10个,后面可以直接利用 %10$ 定位到这个位置。
随机生成函数的位置是0x804c044开始的,长度为4字节,依次+1即可。
在这里插入图片描述
所以可以用去定位到这4个地址,再用%n修改这这个地址里的内容,因此构造payload




 
  

写入任意一个数据

 
  
 
  

在这里插入图片描述

版权声明


相关文章:

  • kmp算法的nextval数组怎么求2025-09-29 08:01:02
  • 数据结构二叉树实验原理2025-09-29 08:01:02
  • java hashset hashcode2025-09-29 08:01:02
  • 免费dns解析服务器地址2025-09-29 08:01:02
  • 数据结构归并排序例题2025-09-29 08:01:02
  • jython和python2025-09-29 08:01:02
  • 小程序码 生成2025-09-29 08:01:02
  • blp模型属于2025-09-29 08:01:02
  • 公共dns20212025-09-29 08:01:02
  • 什么是交叉编译,为什么要使用交叉编译?2025-09-29 08:01:02