есть код
static unsigned char shellcode[32] = {
0x31, 0xFF, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x0F, 0x05, 0x48, 0x8D,
0xB8, 0x00, 0x10, 0x00, 0x00, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x0F,
0x05, 0x48, 0x2D, 0x00, 0x10, 0x00, 0x00, 0xCC, 0x90, 0x90
};
int main(int argc, char * argv[]) {
struct user_regs_struct regs;
pid_t pid = (pid_t)atoi(argv[1]);
if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) < 0)
return 1;
if (wait(NULL) < 0)
return 2;
if (ptrace(PTRACE_GETREGS, pid, NULL, ®s) < 0)
return 3;
unsigned long * ptr = (unsigned long*)shellcode;
unsigned long rip = regs.rip & ~4095;
unsigned long address = regs.rip;
long word;
do {
errno = 0;
if ((word = ptrace(PTRACE_PEEKTEXT, pid, rip, NULL) && errno) < 0)
return 4;
if (ptrace(PTRACE_POKETEXT, pid, rip, ptr) < 0)
return 5;
*ptr = (unsigned long)word;
rip += 8;
++ptr;
} while (!(rip & 0x20));
rip -= 32;
regs.rip = rip;
ptr -= 8;
if (ptrace(PTRACE_SETREGS, pid, NULL, ®s) < 0)
return 6;
if (ptrace(PTRACE_CONT, pid, NULL, NULL) < 0)
return 7;
if (wait(NULL) < 0)
return 8;
for (; !(rip & 0x20) && ((word = ptrace(PTRACE_POKETEXT, pid, rip, ptr)) >= 0 || !errno); rip += 8, ++ptr);
if (errno)
return 9;
regs.rip = address;
if (ptrace(PTRACE_SETREGS, pid, NULL, ®s) < 0)
return 10;
return 0;
}
при его выполнении brk у процесса pid не увеличивается
shellcode соответствует следующему коду
xor edi, edi
mov eax, 12 ; sys_brk
syscall
lea rdi, qword [rax + 4096]
mov eax, 12
syscall
sub rax, 4096
int3
nop
nop
в чем причина?
>>>