Ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓

ptrace (рдкреНрд░реЛрд╕реЗрд╕ рдЯреНрд░реЗрд╕ рд╕реЗ) - рдХреБрдЫ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо (рд▓рд┐рдирдХреНрд╕, рдлреНрд░реАрдмреАрдПрд╕рдбреА, рдореИрдХреНрд╕ рдУрдПрд╕ рдПрдХреНрд╕ рд╕рд╣рд┐рдд) рдкрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓, рдЬреЛ рдЖрдкрдХреЛ рдЪрдпрдирд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЯреНрд░реЗрд╕ рдпрд╛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ptrace рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ: рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдореГрддрд┐ рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ - рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рд░рдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдПрдХ рд╕реЗрдЯ рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЯреНрд░реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣реА рдмрд┐рдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред



рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред



1. ptrace рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛



рдпрд╣рд╛рдБ рдХреНрдпрд╛ ptrace рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рджрд┐рдЦрддрд╛ рд╣реИ:

#include <sys/ptrace.h>

long ptrace( enum __ptrace_request request, pid_t pid, void *addr, void *data);




рдЖрдк рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (PTRACE_ATTACH) рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ PTRACE_TRACEME рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕рдорд╛рди рд╣реИред рдЯреНрд░реЗрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрди рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдЖрджрдореА ptrace рджреЗрдЦреЗрдВред



2. рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рджреЗрдЦреЗрдВ



рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ (рд╕реНрдЯреНрд░реЗрд╕ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд╛ рдПрдХ рд╕рд░рд▓ рдПрдирд╛рд▓реЙрдЧ)ред



рддреЛ, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рдХрд╛рдВрдЯрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдЪреНрдЪреЗ рдХреЛ рдбрд┐рдмрдЧ рдХрд░реЗрдЧреА:



int main( int argc, char *argv[]) {

pid_t pid = fork();

if (pid)

parent(pid);

else

child();

return 0;

}






рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - PTRACE_TRACEME рдХреЗ тАЛтАЛрд╕рд╛рде рдЯреНрд░реЗрд╕ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ:



void child() {

ptrace(PTRACE_TRACEME, 0, 0, 0);

execl( "/bin/echo" , "/bin/echo" , "Hello, world!" , NULL);

perror( "execl" );

}






рдЬрдм рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯреНрд░реЗрд╕ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдирдпрд╛ рд░рд╛рдЬреНрдп рдкрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рдкреИрд░реЗрдВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╣рд▓реЗ рд╡реЗрдЯрдкрд┐рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдЖрдк рдмрд╕ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ):



int status;

waitpid(pid, &status, 0);






рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдФрд░ рдЕрдиреНрдп рд╕реНрдЯреЙрдкреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SIGTRAP) рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ PTRACE_O_TRACESYSGOOD рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ SIGTRAP рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред 0x80 :



ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);





рдЕрдм рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдкрд╛рд╢ рдореЗрдВ PTRACE_SYSCALL рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП eax рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PTRACE_GETREGS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд░реЛрдХ рдХреЗ рд╕рдордп рдИрдПрдХреНрд╕рдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЧрдП рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ редorig_x :



while (!WIFEXITED(status)) {



struct user_regs_struct state;



ptrace(PTRACE_SYSCALL, pid, 0, 0);

waitpid(pid, &status, 0);



// at syscall

if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80) {

ptrace(PTRACE_GETREGS, pid, 0, &state);

printf( "SYSCALL %d at %08lx\n" , state.orig_eax, state.eip);



// skip after syscall

ptrace(PTRACE_SYSCALL, pid, 0, 0);

waitpid(pid, &status, 0);

}



}






рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрддреЗ рд╣реИрдВ:



...

SYSCALL 6 at b783a430

SYSCALL 197 at b783a430

SYSCALL 192 at b783a430

SYSCALL 4 at b783a430

Hello, world!

SYSCALL 6 at b783a430

SYSCALL 91 at b783a430

SYSCALL 6 at b783a430

SYSCALL 252 at b783a430






рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ 4 рдХреЗ рдмрд╛рдж (рдФрд░ рдпрд╣ sys_write рд╣реИ ), рд╣рдорд╛рд░рд╛ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред



3. рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛



рдЕрдм рдЪреБрдиреМрддреА рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдЦрди рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



write(fd, buf, n);



рдкрд╛рда рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, PTRACE_POKETEXT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:



// sys_write

if (state.orig_eax == 4) {

char * text = ( char *)state.ecx;

ptrace(PTRACE_POKETEXT, pid, ( void *)(text+7), 0x72626168); //habr

ptrace(PTRACE_POKETEXT, pid, ( void *)(text+11), 0x00000a21); //!\n

}






рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ ...



...

SYSCALL 6 at 00556416

SYSCALL 197 at 00556416

SYSCALL 192 at 00556416

SYSCALL 4 at 00556416

Hello, habr!

SYSCALL 6 at 00556416

SYSCALL 91 at 00556416

SYSCALL 6 at 00556416

SYSCALL 252 at 00556416






рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдкрд╛рда рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП / рдмрд┐рди / рдЧреВрдВрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ sys_write рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ред рдпрд╣ ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ рдореЗрдореЛрд░реА рдбрдВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╡реИрд╕реЗ, рд▓рд┐рдирдХреНрд╕ рдХреНрд░реИрдХрдорд┐рдХреНрд╕ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ), рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ (PTRACE_SINGLESTEP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢ рдХреЛ 0xCC рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░), рд╡рд┐рд╢реНрд▓реЗрд╖рдг / рдЪрд░ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред ptrace рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдХреЛрдб рдХреЗ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдирд╣реАрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрдЧрд░ рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдХреВрджрдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдирдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдпрджрд┐ рдЖрдк ptrace рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВрдЧреЗред рдмреЗрд╢рдХ, рдХреБрдЫ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рд╡реЗ рд╢рд╛рдпрдж рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рд╣реАрди рд╣реИрдВред



UPD: рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛



4. рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ



рдЖрджрдореА ptrace

рдЖрджрдореА рд░реБрдХреЛ

рдкреАрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛, рднрд╛рдЧ I

Ptrace рдХреЗ рд╕рд╛рде рдЦреЗрд▓, рднрд╛рдЧ II

syscalls рддрд╛рд▓рд┐рдХрд╛



All Articles