吕梁市网站建设_网站建设公司_留言板_seo优化
2025/12/21 20:11:09 网站建设 项目流程

1 :ret2syscall

ret2syscall大概就是:通过在程序中寻找系统调用函数syscall代码等来构造出一个后门危险函数
Linux常用系统调用号

  • 32位系统下常用的有

    • execve(0xb)
    • read(0x3)
    • open(0x4)
    • write(0x5)
  • 64位系统下常用的有

    • execve(0x3b)
    • read(0x0)
    • open(0x1)
    • write(0x2)

在实现具体的攻击手法之前,我们要先了解系统调用的过程

  1. 首先用户态发起系统调用请求:用户程序通过编程语言提供的系统调用接口(如C语言中的库函数)发出系统调用请求,请求操作系统执行某种特定的操作。
  2. 权限检查:操作系统接收到用户程序的请求后,会进行权限检查,以确保用户程序有权限执行该系统调用。
  3. 切换到内核态:如果权限检查通过,操作系统会将用户程序的上下文切换到内核模式,以便执行操作系统提供的服务。
  4. 执行系统调用:操作系统执行用户程序请求的系统调用功能,这可能包括打开或关闭文件、创建或终止进程、进行内存管理等各种操作。
  5. 返回结果和错误处理:系统调用执行完毕后,操作系统会将执行结果返回给用户程序,并进行相应的错误处理,例如返回错误码或打印错误信息等。
  6. 切换回用户态:操作系统完成系统调用操作后,将会切换回用户态,继续执行用户程序的下一条指令。

一般在32位/64位下通过int 0x80/syscall ret(中断系统调用)来区分是否发起系统调用,系统调用号则利用在eax(32位)或rax(64位)寄存器中的序号

运行shell一般我们用execve("bin/sh",0,0)

注意32位下正常利用栈传递参数,而在系统调用中则根据ebx,ecx,edx,esi,edi的寄存器顺序通过寄存器传递参数!
64位则正常根据寄存器顺序:rdi,rsi,rdx,r10,r8,r9传递参数;

下面我们来研究攻击手法

  1. 首先通过file命令,查看是32位还是64位系统
  2. 接下来寻找pop eax/rax ;ret借此传递我们需要调用的系统调用号进而调用我们需要的函数
  3. 接下来寻找控制ebx;ecx;edx或rdi;rsi;rdx的gadget
  4. 最后通过执行execve("bin/sh",0,0)来getshell

如果没有现成的bin/sh字符串可以通过调用read函数往bss段去写入字符串后再调用execve

2:mprotect

mprotect函数主要用于修改内存权限为可读可写可执行来写入shellcode进而getshell
其函数原型为int mprotect(const void *start, size_t len, int prot)

  1. 第一个参数代表开始修改的地址注意必须是一个内存页(可通过在ida用ctrl+s查看段表)的起始地址(地址的最后三位数为000)
  2. 第二个参数代表修改的长度注意必须为页大小的整数倍(一般是4kb对应0x1000)
  3. 第三个参数是要赋予修改的权限(为7时即为可读可写可执行)

基于此我们就可以明白攻击方法

  1. 首先寻找mprotect函数的地址
  2. 寻找能写入的函数的地址(如read)
  3. 修改内存权限
  4. 写入shellcode
  5. 返回写入shellcode的地址从而getshell

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询