经典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")