app攻防-用Ptrace击溃SVC&工具开发篇

admin 2025年2月15日09:02:20评论5 views字数 2068阅读6分53秒阅读模式

作者:yueji0j1anke

首发于公号:剑客古月的安全屋

字数:1128

阅读时间:    5min

声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外

目录

  • 前言

  • 前置知识

  • 测试demo开发

  • 效果

0x00 前言

本文续接前文,聊聊app攻防-SVC的终极奥义Ptrace+Seccomp,如何用ptrace去hook并修改svc要读取的对象(IO重定向的实现)

0x01 前置知识

1.ARM64寄存器

首先讲讲ARM64常见寄存器

存在x0-x30 31个常见寄存器,x0-x7用于参数传递和返回值,x8通常用作系统调用号,x29用作帧指针,x30存储函数调用返回地址

2.系统调用

syscall是用户与系统调用打交道的接口,通过其可以直杀linux内核态,请求内核执行某些服务的接口,比如文件操作、进程控制、网络通信等,每个对应的系统调用都有唯一的系统编号,不同架构不一样。比如arm64,这里我这样定义

#define __NR_io_setup 0
#define __NR_io_destroy 1
#define __NR_io_submit 2
#define __NR_io_cancel 3
#define __NR_io_getevents 4
#define __NR_setxattr 5
#define __NR_lsetxattr 6
#define __NR_fsetxattr 7
#define __NR_getxattr 8
......

对应调用demo如下

pid_tpid=syscall(SYS_getpid);
printf("Process ID: %dn"pid);

return0;

3.ptrace常用api和常量

ptrace(PTRACE_ATTACH,pid,0,0) ptrace附加进程
ptrace(PTRACE_CONT, pid, (void *)0, 0); 让进程恢复运行
ptrace(PTRACE_DETACH, pid, 0, (void *)SIGCONT); 取消附加

0x02 开发过程

首先肯定是注入进程

我这里选取的思路就直接选取注入app进程试试demo了

intres=ptrace(PTRACE_ATTACH,targetIds[i],0,0);

把输入的app pid对应的所有子进程获取并注入

随后需要拦截syscall调用

ptrace(PTRACE_SYSCALLpid00);

随后等待信号SIGTRAP状态,

满足条件就直接进入调用hook逻辑

if(status>>8==SIGTRAP&&wait_pid==ENTER){
hook(wait_pid);
         }

在该函数中,我们需要获取寄存器参数值,方便我们后续转化和io重定向

ptrace(PTRACE_GETREGSETpid, (void*)NT_PRSTATUS&io)

其中regs.ARM_x8即是我们对应的系统调用号

对应的取地址操作,这里直接抄的网上函数

voidgetdata(pid_tpiduint64_taddrchar*strlongsz)
{
inti=0j=sz/long_size;
char*s=str;
while (i<j) {
*(long*)(s+i*8=ptrace(PTRACE_PEEKDATApidaddr+i*8NULL);
++i;
    }
j=sz%long_size;
if (j!=0) {
*(long*)(s+i*8=ptrace(PTRACE_PEEKDATApidaddr+i*8NULL);
    }
}

回来的str就是我们对应read的对象

把对应的x1寄存器取出替换即可

这部分继续借鉴网上函数(bushi

voidputdata(pid_tpiduint64_taddrchar*strlongsz)
{
inti=0j=sz/long_size;
char*s=str;
while (i<j) {
ptrace(PTRACE_POKEDATApidaddr+i*8*(long*)(s+i*8));
++i;
    }
j=sz%long_size;
if (j!=0) {
ptrace(PTRACE_POKEDATApidaddr+i*8*(long*)(s+i*8));
    }
}

差不多整个流程就结束了....

编译

clang++ -target aarch64-linux-android21 syscall_hook64.cpp  -o PtraceHook -static-libstdc++

运行

0x03 效果

boot id值成功被重定向

但存在问题->ptrace之后手机卡死了。。。这可能也是只有hook工具没有修改其的操作工具吧。

后期完善之后把代码贴仓库.。。。

原文始发于微信公众号(剑客古月的安全屋):app攻防-用Ptrace击溃SVC&工具开发篇

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日09:02:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   app攻防-用Ptrace击溃SVC&工具开发篇https://cn-sec.com/archives/3743261.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息