#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ptrace.h>
#include <sys/user.h>
#include <sys/wait.h>

void getdata(pid_t child,long addr,char *str,int len);
void setdata(pid_t child,long addr,char *str,int len);

int main(int argc,char *argv[])
{
    pid_t traced_process = 0;
    long ret = 0;
    struct user_regs_struct regs = {};
    struct user_regs_struct oldregs = {};
    long ins = 0;
    //char code[] = {0xcd,0x80,0xcc,0};//int 0x80,int 3
    char code[] = {0xeb,0x0e,0x68,0x65,0x6c,0x6c,0x6f,0x2c,0x77,0x6f,0x72,0x6c,0x64,0x21,0x0a,0x00,0xe8,0x00,0x00,0x00,0x00,0x41,0x5f,0x49,0x83,0xef,0x13,0xb8,0x01,0x00,0x00,0x00,0xbf,0x02,0x00,0x00,0x00,0x4c,0x89,0xfe,0xba,0x0e,0x00,0x00,0x00,0x0f,0x05,0xcd,0x80,0xcc};// print "hello world"
    int code_len = sizeof(code);
    char backup[sizeof(code)];

    if(argc != 2){
        printf("Usage:%s <pid to be traced>\n",argv[0]);
        exit(1);
    }

    traced_process = atoi(argv[1]);

    ret = ptrace(PTRACE_ATTACH,traced_process,NULL,NULL);
    if(ret == -1){
        perror("attach error\n");
        exit(1);
    }

    wait(NULL);

    ptrace(PTRACE_GETREGS,traced_process,NULL,&regs);
    oldregs = regs;

    getdata(traced_process,regs.rip,backup,code_len);
    setdata(traced_process,regs.rip,code,code_len);

    ptrace(PTRACE_CONT,traced_process,NULL,NULL);

    wait(NULL);

    printf("The process stopped,putting back the original instructions\n");
    printf("Press <enter> to continue\n");
    getchar();
    setdata(traced_process,oldregs.rip,backup,code_len);

    ptrace(PTRACE_SETREGS,traced_process,NULL,&oldregs);
    ptrace(PTRACE_DETACH,traced_process,NULL,NULL);
    return 0;
}

void getdata(pid_t child,long addr,char *str,int len)
{
    long data;
    int j = len / sizeof(data);
    int i;
    char *pos = str;

    for(i = 0;i<j;i++){
        data = ptrace(PTRACE_PEEKDATA,child,addr + i*sizeof(data),NULL);
        memcpy(pos,&data,sizeof(data));
        pos += sizeof(data);
    }

    j = len %sizeof(data);
    if( j != 0){
        data = ptrace(PTRACE_PEEKDATA,child,addr + i*sizeof(data),NULL);
        memcpy(pos,&data,j);
    }
}

void setdata(pid_t child,long addr,char *str,int len)
{
    long data;
    int i,j;
    j = len /sizeof(data);

    for(i = 0;i<j;i++){
        ptrace(PTRACE_POKEDATA,child,addr + i* sizeof(data),*(long*)(str+i*sizeof(data)));
    }

    j = len % sizeof(data);
    if(j!=0){
        data = ptrace(PTRACE_PEEKDATA,child,addr + i* sizeof(data),NULL);//align
        memcpy(&data,str+i*sizeof(data),j);
        ptrace(PTRACE_POKEDATA,child,addr + i* sizeof(data),data);
    }
}

参考质料:

https://www.linuxjournal.com/article/6100

https://www.linuxjournal.com/article/6210

Linux -- 利用 ptrace 进行代码注入的更多相关文章

  1. phpMyAdmin setup.php脚本的任意PHP代码注入漏洞

    phpMyAdmin (/scripts/setup.php) PHP 注入代码 此漏洞代码在以下环境测试通过:      phpMyAdmin 2.11.4, 2.11.9.3, 2.11.9.4, ...

  2. 【技巧总结】Penetration Test Engineer[3]-Web-Security(SQL注入、XXS、代码注入、命令执行、变量覆盖、XSS)

    3.Web安全基础 3.1.HTTP协议 1)TCP/IP协议-HTTP 应用层:HTTP.FTP.TELNET.DNS.POP3 传输层:TCP.UDP 网络层:IP.ICMP.ARP 2)常用方法 ...

  3. Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

    在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...

  4. 注入攻击-SQL注入和代码注入

    注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...

  5. 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...

  6. CVE漏洞—PHPCMS2008 /type.php代码注入高危漏洞预警

    11月4日,阿里云安全首次捕获PHPCMS 2008版本的/type.php远程GetShell 0day利用攻击,攻击者可以利用该漏洞远程植入webshell,导致文件篡改.数据泄漏.服务器被远程控 ...

  7. ref:PHP代码注入审计

    ref:https://www.waitalone.cn/php-code-injection.html 通俗易懂,全面清晰. 0x1 前言 为了方便自己以后的翻阅和查找,最近正在整理一些所学的内容. ...

  8. Windows下的代码注入

    木马和病毒的好坏很大程度上取决于它的隐蔽性,木马和病毒本质上也是在执行程序代码,如果采用独立进程的方式需要考虑隐藏进程否则很容易被发现,在编写这类程序的时候可以考虑将代码注入到其他进程中,借用其他进程 ...

  9. SQLmap是一款用来检测与利用SQL漏洞的注入神器。

    sqlmap 重要参考 http://www.kali.org.cn/forum-75-1.html SQLmap是一款用来检测与利用SQL漏洞的注入神器.开源的自动化SQL注入工具,由Python写 ...

随机推荐

  1. JQuery实现省市区的三级联动

    JQuery实现省市区的三级联动 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "h ...

  2. maven 如何依赖工程项目里面的 jar 包

    前言:现在有个 jar 包在私服和公共仓库里面都没有,需要自己将 jar 包放在工程里,然后让 maven 依赖. 这里举个栗子 项目路径: pom.xml 配置 <!--自定义查询组件的jar ...

  3. 外机连接本机的虚拟机服务器_VM端口映射

    说明:有时候我们把服务器放在虚拟机上的时候只能本机在网页上连接,但是如果想要别的电脑也能访问的话,需要在VM上做一个映射.实现如下: 设置VM端口映射 一.打开VM->编辑->虚拟网络编辑 ...

  4. Flask wtforms实现简单的登录注册

    目录结构 视图 # -*- coding:utf-8 -*- # Author : Niuli # Data : 2019-02-27 19:26 from flask import render_t ...

  5. JS 判断是否是手机端并跳转操作

    JS 判断运行当前脚本的应用程序是否为手机端或者一些其他信息,在我的工作中遇到的不是十分频繁,被我的同事一问就给问住了,所以把之前找到的一些知识点整理出来,供大家参考,若哪里不对欢迎指出,我会及时的更 ...

  6. SD从零开始67-70 后勤信息系统中的标准分析, 信息结构, 信息的更新规则, 建立统计数据

    SD从零开始67 后勤信息系统中的标准分析 标准分析中的报表Reporting in Standard Analyses 标准分析为高质量的表达和分析LIS中的数据基础提供了大量的功能: 当你决定了一 ...

  7. Android SDK Manager无法更新的解决方案

    Android SDK Manager -> Tools -> Options HTTP Proxy Server:mirrors.neusoft.edu.cn HTTP Proxy Po ...

  8. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

    交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别 自己之前一直没搞清楚这两个交叉编译器到底有什么问题,特意google一番,总结如下,希望能帮到道上和 ...

  9. JMeter 逻辑控制之While循环控制器(While Controller)

    逻辑控制之While循环控制器(While Controller)   by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1.   添加While Control ...

  10. python变量的命名空间

    首先必须要提一下python程序执行过程中变量的查找规则 较官方的查找机制是: 局部作用域--外部函数作用域--全局作用域--内建函数作用域 其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是 ...