Ошибка RUST ENOMEM при вызове posix_memalign в прикрепленной программе
Я попытаюсь резюмировать, но это будет сложно.
В моем университете я изучаю операционные системы, и мне нужно выполнить лабораторную работу. Я работаю в Rust (лабораторная работа, как говорят, может быть выполнена на любом компилируемом языке, но изначально изначально была разработана для C).
Итак, у меня есть программа трассировки и программа трассировки .
Цель этого шага лабораторной работы - подключиться от трассировщика к трассировке с помощью ptrace, а затем ввести инструкции "trap-call-trap" в подходящее место для замены существующей бесполезной функции функцией posix_memalign (из libc) в трассированном , косвенным вызовом через регистры (с rax). Цель состоит в том, чтобы выделить память, чтобы впоследствии иметь возможность вызывать код кэша из другого файла в отслеживаемую программу.
Проблема, с которой я столкнулся, заключается в том, что мне удалось выполнить posix memalign в трассировщике, поэтому я знаю, что функция работает, но когда я вызываю ее в трассировке (через трассировщик) и смотрю в регистре rax для возврата функции, я всегда получайте «12», что соответствует ENOMEM (ENOMEM Недостаточно места / невозможно выделить память).
У меня есть 2 отдельных грузовых проекта, чтобы иметь возможность запускать каждую программу отдельно от груза. Все на этом мерзавце: https://github.com/Carrybooo/TP_SEL
Мне очень жаль, что все распечатки и материалы на французском (некоторые комментарии тоже, я учусь на французском), и я не думал, что мне придется делиться этим с кем-нибудь. В нем также много бесполезного кода из предыдущих этапов лабораторной работы, который я сохранил на всякий случай, поэтому мой код не совсем чистый.
Это та часть, где я прикрепляю и изменяю регистры для вызова функции (я сократил код и не показывал вам объявления вспомогательных функций, потому что это было бы слишком долго):
ptrace::attach(pid_ptrace) //attaching to process
wait(); //wait after attaching
inject(pid_trace, offset_fct_to_replace, false); //injecting trap-call-trap
ptrace::cont(pid_ptrace, Signal::SIGCONT);
wait(); //wait for 1st trap
let mut regs =
ptrace::getregs(pid_ptrace);
let ptr_to_ptr: *mut *mut c_void = ptr::null_mut();
regs.rax = get_libc_address(pid_trace).unwrap() + get_libc_offset("posix_memalign").unwrap();
regs.rsp = regs.rsp - (size_of::<*mut *mut c_void>() as u64);
regs.rdi = ptr_to_ptr as u64;
regs.rsi = size_of::<usize>() as u64;
regs.rdx = size_of::<usize>() as u64;
ptrace::setregs(pid_ptrace, regs); //set regs with modification
ptrace::cont(pid_ptrace, Signal::SIGCONT);
wait();
let regs = ptrace::getregs(pid_ptrace);
ptrace::detach(pid_ptrace, Signal::SIGCONT) //detaching
И запуск программы в терминале дает примерно следующее:
before modification of regs:
rax = 6
rip = 55e6c932ddc1
rsp = 7ffcee0b7fb8
before function execution:
rax = 7f59b935ded0
rdi = 0
rip = 55e6c932ddc1
rsp = 7ffcee0b7fb0
after function execution:
rax = 12 <------//RESULT OF THE CALL IS HERE
rdi = 55e6cac6aba0
rip = 7f59b935df20
rsp = 7ffcee0b7f90
//end of program
Так что да, я не знаю, почему я продолжаю получать ошибку при этом вызове, я полагаю, это потому, что это нарушает безопасность памяти ржавчины, потому что компилятор никогда не знал в отслеживаемой программе, что ему придется выделить память, но я не уверен этого, ни как его обойти. Я надеюсь, что я был достаточно ясен, дайте мне знать, если вам понадобятся какие-либо подробности, и я заранее благодарен всем, кто может мне помочь. Мы будем рады каждому совету.
1 ответ
Так что я пошел с сырьем
До сих пор не знаю, почему