Linux -- 利用 ptrace 进行代码注入
#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,®s);
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 进行代码注入的更多相关文章
- phpMyAdmin setup.php脚本的任意PHP代码注入漏洞
phpMyAdmin (/scripts/setup.php) PHP 注入代码 此漏洞代码在以下环境测试通过: phpMyAdmin 2.11.4, 2.11.9.3, 2.11.9.4, ...
- 【技巧总结】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)常用方法 ...
- Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)
在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建 ...
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...
- CVE漏洞—PHPCMS2008 /type.php代码注入高危漏洞预警
11月4日,阿里云安全首次捕获PHPCMS 2008版本的/type.php远程GetShell 0day利用攻击,攻击者可以利用该漏洞远程植入webshell,导致文件篡改.数据泄漏.服务器被远程控 ...
- ref:PHP代码注入审计
ref:https://www.waitalone.cn/php-code-injection.html 通俗易懂,全面清晰. 0x1 前言 为了方便自己以后的翻阅和查找,最近正在整理一些所学的内容. ...
- Windows下的代码注入
木马和病毒的好坏很大程度上取决于它的隐蔽性,木马和病毒本质上也是在执行程序代码,如果采用独立进程的方式需要考虑隐藏进程否则很容易被发现,在编写这类程序的时候可以考虑将代码注入到其他进程中,借用其他进程 ...
- SQLmap是一款用来检测与利用SQL漏洞的注入神器。
sqlmap 重要参考 http://www.kali.org.cn/forum-75-1.html SQLmap是一款用来检测与利用SQL漏洞的注入神器.开源的自动化SQL注入工具,由Python写 ...
随机推荐
- 【Tomcat】详解tomcat的连接数与线程池
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). Connector的主要功能,是接收连接请求,创建Req ...
- 【hibernate】1、Hibernate的一个注解 @Transient
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic ...
- Nhibernate学习的第二天
Fluent-Nhibernate 网站:http://www.fluentnhibernate.org/ 使用NuGet下载Fluent-Nhibernate. 1.创建实体类 2.创建实体类映 ...
- Python 练习: 打印0到99小于50或大于70的数字
for i in range(100): if i < 50 or i > 70: print(i) 注意: range(100) 表示 0 到 99 个数字
- 【读书笔记】iOS-Settings Bundle
一,打开工程--->右键--->Add File--->iOS-->Resource-->Settings Bundle. 二,会弹出如下对话框---->Creat ...
- 【读书笔记】iOS-iCloud文件备份
iOS应用在运行时经常要创建一些文件,不过这些文件要如何存放呢?有没有什么要求呢? 由于手机资源空间有限而且考虑到Apple推出的iCloud,我们确实要对创建出的文件按照作用的不同,分出几种类别出来 ...
- css中那些属性可以被继承
主要的有: 字体相关:line-height, font-family, font-size, font-style, font-variant, font-weight, font 文本相关: le ...
- SAP MM 并非奇怪现象之MB5B报表查不到某一笔出库记录?
物料号:1301002696 工厂代码:2160 MB5B,如下查询条件, 查询结果中,期初与期末库存数量都是0,期间的出库入库数量都是0.事实上该物料期初应该是有库存的.并且我用MB51相同时间段查 ...
- 【机器学习】激活函数(Activation Function)
https://blog.csdn.net/ChenVast/article/details/81382795 激活函数是模型整个结构中的非线性扭曲力 神经网络的每层都会有一个激活函数 1.逻辑函数( ...
- 《Inside C#》笔记(十五) 非托管代码 下
二编写不安全代码 a)fixed关键字 代码中体现了fixed的用法:fixed (type* ptr= expression) { …}:type是类似int*这样的非托管类型或void类型,exp ...