实验环境、代码、及准备

https://www.cnblogs.com/lqerio/p/12870834.html

vul5

Snprintf函数,百度百科:

将可变个参数(...)按照format格式化成字符串,然后将其复制到str中。

(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');

(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。

查阅资料可知:

snprintf(buf, sizeof buf, arg);

snprintf()函数,该函数的作用为将第三个参数生成的格式化字符串拷贝到第一个参数中,拷贝的大小由第二个参数进行设置。并且其会根据格式化字符串的形式进行替换:在遇到格式化字符串参数之前,它会先将字符拷贝,当遇到格式化字符参数时,该函数会对指定的格式化字符进行替换。

%n:将%n之前printf已经打印的字符个数赋值给偏移处指针所指向的地址位置,如%100×10$n表示将0x64写入偏移10处保存的指针所指向的地址(4字节),而%$hn表示写入的地址空间为2字节,%$hhn表示写入的地址空间为1字节

格式参考了:

https://blog.csdn.net/u010517901/article/details/46486341

https://blog.csdn.net/qq_36779888/article/details/89684453

故此次溢出的构造应该是构造合适的arg,从而构造合适的参数(%n),从而修改snprintf函数的返回地址,跳转到payload。

shellcode(构造过程)

原理是运行/bin/sh 来得到shell,构造过程是将具有运行/bin/sh的C代码转换成有相同功能的机器码。注意代码中用到  0  的地方改成用 xor  eax,eax,这样可以避免复制字符串时遇到/0 中断。

下面的shellcode长度为45字节(不含/0)

/*

* Aleph One shellcode.

*/

static const char shellcode[] =

"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"

"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"

"\x80\xe8\xdc\xff\xff\xff/bin/sh";

exploit5

 

Gdb /tmp/vul5

Disas foo

0x80484cb 0x80484e3

先构造一个简单的payload,用做测试

gdb -e exploit5 -s /tmp/vul5

catch exec

r

break *0x80484cb

c

此时刚刚进入fooebpbuf地址分别为

B snprintf

此时disas查看snprintf的汇编

查看此时的,ebp,esp及其内容,可见snprintf没有改变ebp,而esp(0xbffffb2c)指向的是0x80484e8,是snprintf的返回地址(下一条指令),所以我们只要构造合适的payload,覆盖0xbffffb2c中的返回地址,使其指向我们的payload即可。

 

所以payload需要使用合适的参数修改esp(0xbffffb2c)的值。能修改的参数只有%n,写入的数据是已经输出的字符数,所以只需要构造合适的数目的字符就可以修改为指定地址。(比如40个字符,就写入0x28)

Vul5中,Snprintf用到%u参数时不断的修改buf,所以返回的地址不能是buf,那么只能是arg。

查看arg的地址:重新gdb调试,在foo break查看

为 0xbffffcd4,而buf地址在0xbffffb3c,相差408字节,为了不覆盖到arg,payload需要不超过408字节。(这里我觉得其实snprintf限制了不超过buf的400字节了)

考虑到添加一些nop,最终返回地址可以是&arg+0x40=0xbffffd14

字符串长度不应该过长,所以每次修改esp指向的一字节。比如往esp(0xbffffb2c)写入0xbffffcf4的f4,需要有16*f+4=244个字符

写fc需要252个字符,ff需要255字符,最后的bf,需要191个字符

修改地址的payload部分为

然后填nop和shellcode即可

然后这样出了问题,总是跳到一个随机的地址

Gdb调试,发现是arg的地址出错。是0xbffffe62

目标地址改为 0xbffffea2即可

最新文章

  1. 使用Open xml 操作Excel系列之一-读取Excel
  2. webform Repeater、地址栏传值、Response
  3. struts原理
  4. 10TSQL语言概述-脚本调试-命名规范-天轰穿数据库2014
  5. 被IP代理网站屏蔽了,真是跪了
  6. bzoj1030
  7. js 表单不为空,数字长度验证
  8. 解决Admob Banner首次展示不显示的问题
  9. 使用链表实现队列------《数据结构与算法分析-C语言描述》
  10. (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)
  11. AngularJSLiveLessons
  12. 轻松把你的项目升级到PWA
  13. Android之自定义AlertDialog和PopupWindow实现(仿微信Dialog)
  14. MyBatis 缓存机制
  15. 微服务下的容器部署和管理平台Rancher
  16. 记一次oracle数据库复制过程
  17. jQuery 常用的方法
  18. delphi图片欣赏
  19. python之os库
  20. Identity(五)

热门文章

  1. 2021 Duilib最新入门教程(一)Duilib简介
  2. Py集合,字符串的格式化,函数,便利
  3. Soul API 网关源码解析 03
  4. SpringMVC Tomcat 启动时报错:java.lang.IllegalStateException: Error starting child
  5. 为了更好的多线程性能,在对象创建或者更新时,若数据大于2047字节则 Python 的 GIL 会被释放。 执行计算密集型任务如压缩或哈希时释放 GIL
  6. 函数式编程 偏函数 生成器 yield
  7. WPF排版布局经验总结(干货)简短不疲倦
  8. 洛谷P4127
  9. 安装Archlinux+UEFI启动
  10. Spark JDBC系列--取数的四种方式