Задать вопрос

Точка останова, Ptrace. Почему крашится программа после снятия точки останова?

Пробую присоединится к программе и поставить точку останова на начале функции asd3()

62f618bc61db3731032615.png

Копирую адрес выделенным синим, вместо 0x55 записываю точку останова 0xCC.
Программа останавливается там где нужно, убираю точку останова, записываю прежнее значение 0x55, вычитаю из регистра RIP 1 что бы при запуске команда push rbp
выполнилась.
Но когда я пытаюсь продолжить выполнение программы она крашится " Ошибка сегментирования "
Попытки сделать STEP (после степа wait(NULL) ) после восстановления так же ничего не дают(сдвигается на одну команду, сколько бы STEP не делал) . Сделать ptrace detach тоже ничего не дает.

Файл с ptrace:
int main()
{
	int pid = 16227;
	long addr = 0x555AA7B7D1E3;
	struct user_regs_struct regs;
	
	cout << "attach " << ptrace(PTRACE_ATTACH, pid, NULL, NULL)<<endl;
	wait(NULL);
	
	cout << "ставим точку останова " << ptrace(PTRACE_POKETEXT, pid, addr, 0xCC) << endl;

cout << "снимаем процесс с паузы и ждем точки останова "<<ptrace(PTRACE_CONT, pid, NULL, NULL) << endl;
	wait(NULL);
	
	cout << "стоим на точке останова, получаем регистры "<< ptrace(PTRACE_GETREGS, pid, NULL, &regs)<< endl;
	
	
	cout << "удаляем точку останова " << ptrace(PTRACE_POKETEXT, pid, addr, 0x55) << endl;
	
	regs.rip -= 1 ;
	cout << "загружаем регистры с rip -1 " <<  ptrace(PTRACE_SETREGS, pid, NULL, &regs)<< endl;
	
	cout << "пробуем продолжить процесс (CONT) " <<ptrace(PTRACE_CONT, pid, NULL, NULL) << endl; 
	
}

Его вывод:
attach 0
ставим точку останова 0
снимаем процесс с паузы и ждем точки останова 0
стоим на точке останова, получаем регистры 0
удаляем точку останова 0
загружаем регистры с rip -1 0
пробуем продолжить процесс (CONT) 0


Подопытный:
#include <iostream>
#include <thread>
#define sleep(val) std::this_thread::sleep_for(val * 1000 ##ms)
using namespace std;

void asd()
{
	cout << "asd" << endl;
}

void asd2()
{
	cout << "asd2" << endl;
}

void asd3()
{
	cout << "asd3" << endl;
}


int main()
{
	while(1)
	{
		asd();
		sleep(0.1);
		
		asd2();
		sleep(0.1);
		
		asd3();
		sleep(0.1);
	}
}

Его вывод (сокращенный до ошибки):
asd
asd2
Ошибка сегментирования


В чем проблема? Что я делаю не так? Проверял туда ли пишу, то ли читаю, и все правильно.
Но почему то ошибка.
------------------------------------------------------------
Решение:
Проблема была в том что ptrace читает и пишет не 1 байт а 8.
  • Вопрос задан
  • 257 просмотров
Подписаться 5 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В чем проблема? Что я делаю не так?

Я подозреваю, что не нужно делать regs.rip -= 1 ;, потому что процесс не может "выполнить" точку останова.
Ну и для надёжности, я бы убедился, что в памяти куда пишется 0xcc действительно до этого было 0x55.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы