простая программа из crackmes, которая выводит в консоль "введите пароль: " и ожидает ввода пароля соответственно. Если ввёл правильно - выводит сообщение "молодец" и закрывается, если неправильно - то выводит сообщение "неверно" и закрывается.
Задача:
Изменить поведение программы через изменяемые сырые указатели (`*mut u8`), чтобы программа без ввода пароля, во время рантайма, сразу выдала "молодец". При этом, важно, не дизассемблируя её, то есть прямая работа с памятью процесса.
Проделанная работа (код - тык):
Определение PID процесса, диапазон и сдвиг адресов, что использует процесс. Для пробы, дёргая за ptrace, пытался изменить:
1) значение хотя бы одного адреса памяти;
2) значение 4-х/8-ми/16-и адресов памяти разом;
3) разом все значения адреса памяти;
Однако, понял, что все адреса памяти - нули. Куда посоветуете копать дальше? Нашел что-то про ASLR, но не очень понимаю что дальше.
p.s. я не пытаюсь "взломать" программу в прямом понимании - интересна конкретно работа и изменение памяти процесса во время рантайма с последующим in-place переопределением поведения, ну и также работа с сырыми указателями и unsafe Rust.
p.p.s.: необязательно помогать кодом) мне скорее требуется понять, куда дальше двигаться, чтобы я понял, почему вся доступная память процесса - это нули, и куда дальше двигаться, чтобы таки изменить память процесса на какое-нибудь любое значение.
Сам крякми дай, чтобы проще было локально потыкать
А ты проверял, что сисколлы работают?
Минутку, сейчас найду, а то распаковал, а ссыль потерял.
Просто тебя с легкостью могли послать нафиг еще на этапе attach, а никакой обработки ошибок я в твоем коде не вижу
Точно скажу, что нет, не проверял. Как я могу это проверить или чтобы не доставать, где можно узнать как проверить?)
Из man 2 ptrace: > RETURN VALUE On success, the PTRACE_PEEK* requests return the requested data (but see NOTES), the PTRACE_SECCOMP_GET_FILTER request returns the number of instructions in the BPF program, and other requests return zero. On error, all requests return -1, and errno is set appropriately. Since the value returned by a successful PTRACE_PEEK* request may be -1, the caller must clear errno before the call, and then check it af‐ terward to determine whether or not an error occurred.
https://crackmes.one/crackme/644af68433c5d43938912c6b
Обсуждают сегодня