前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pwn-exec 1>&0

Pwn-exec 1>&0

作者头像
偏有宸机
发布2020-11-04 10:42:25
1.1K0
发布2020-11-04 10:42:25
举报
文章被收录于专栏:宸机笔记宸机笔记

在做WUSTCTF中的closed这道题时发现的这个问题,经过一番查阅后才知道了作法

先看原题

大概意思为:

  • 先向程序中输入字符串
  • 然后一次执行close(1);close(2);最后返回shell函数也就是system(/bin/sh)

一句简短的payload就可以返回shell

exec 1>&0这段仅有的payload的分析我们可以先引申到linux的EXEC与文件描述符

EXEC的两种用法

  1. exec 命令 ;命令代替shell程序,命令退出,shell 退出;比如 exec ls
  2. exec 文件重定向,可以将文件的重定向就看为是shell程序的文件重定向 比如 exec 5</dev/null;exec 5<&-

文件描述符

  • 01皆为linux下的文件描述符 而在linux中,一切都可以作为文件,文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。 如果此时去打开一个新的文件,它的文件描述符会是3。
  • 而标准输入输出的指向是默认的,我们也可以去修改他的指向,也就是重定位文件描述符。 例如,可以用exec 1>myoutput把标准输出重定向到myoutput文件中,也可以用exec 0<myinput把标准输入重定向到myinput文件中,而且,文件名字可以用&+文件描述符来代替。

再看回原题,这里的close(1);close(2);便是关闭了 标准输出标准错误输出

但我们就可以使用重定位文件描述符的办法,将标准输出重定位到标准输入上来达到返回shell的目的(因为默认打开一个终端后,0,1,2都指向的是当前终端,所以该语句相当于重启了标准输出,也就可以看到程序的输出了)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档