ret2text(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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值