Created
June 25, 2016 11:29
-
-
Save jprudent/437338b32a54bc37d232f5430ee42f87 to your computer and use it in GitHub Desktop.
ptrace ex 3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <sys/ptrace.h> | |
#include <sys/types.h> | |
#include <sys/wait.h> | |
#include <unistd.h> | |
#include <stdio.h> | |
#include <signal.h> | |
#include <sys/user.h> | |
#include <sys/reg.h> | |
void fizzbuzz() { | |
for(int i = 0; i < 100; i++) { | |
int fizz = i % 3 == 0; | |
if(fizz) printf("Fizz"); | |
int buzz = i % 5 == 0; | |
if(buzz) printf("Buzz"); | |
if(!(fizz||buzz)) printf("%d", i); | |
printf(", "); | |
} | |
} | |
int waitchild(pid_t pid) { | |
int status; | |
waitpid(pid, &status, 0); | |
if(WIFSTOPPED(status)) { | |
return 0; | |
} | |
else if (WIFEXITED(status)) { | |
return 1; | |
} | |
else { | |
printf("%d raised an unexpected status %d", pid, status); | |
return 1; | |
} | |
} | |
void trace(pid_t child) { | |
unsigned long instruction, opcode1, opcode2, ip; | |
unsigned long jmps = 0; | |
do { | |
ip = ptrace(PTRACE_PEEKUSER, child, 8 * RIP, NULL); | |
instruction = ptrace(PTRACE_PEEKTEXT, child, ip, NULL); | |
opcode1 = instruction & 0x00000000000000FF; | |
opcode2 = (instruction & 0x000000000000FF00) >> 8; | |
if((opcode1 >= 0x70 && opcode1 <= 0x7F) || | |
(opcode1 == 0x0F && (opcode2 >= 0x83 && opcode2 <= 0x87))) { | |
jmps = jmps + 1; | |
} | |
ptrace(PTRACE_SINGLESTEP, child, NULL, NULL); | |
} while(waitchild(child) < 1); | |
printf("\n=> There are %lu jumps\n", jmps); | |
} | |
int main() { | |
long instruction; | |
pid_t child = fork(); | |
if(child == 0) { | |
ptrace(PTRACE_TRACEME, 0, NULL, NULL); | |
child = getpid(); | |
kill(child, SIGUSR1); | |
fizzbuzz(); | |
} | |
else { | |
// wait for the child to stop | |
waitchild(child); | |
trace(child); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment