Ошибка 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 ответ

Так что я пошел с сырьем вместо использования . Это не так удобно, но, по крайней мере, работает при вызове с регистрами в трассируемой программе.

До сих пор не знаю, почему не работает при вызове из регистров в программе на ржавчине.

Другие вопросы по тегам