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

Как отладить программу с++ в ollyDbg?

Есть программа на с++:
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
char buf[3];
strcpy_s(buf,sizeof(buf), argv[1]);
return 0;
}


В ней есть уязвимое место - strcpy_s(buf,sizeof(buf), argv[1]);
Пытаюсь отладить и отловить наличие ошибки в программе через ollyDbg.
Импортирую программу, задаю входной аргумент, например, 20 символов A, перезапускаю программу с новыми аргументами , два раза нажимаю F9, вылетает сообщение об ошибке (это понятно почему) , но дальше не могу разобраться, где написано о наличии ошибки? Должно быть что-то похожее на Access Violation when execution (41414141) ( читала пример на просторах интернета) , но не могу найти эту строчку никак
dafb0dbb082f4c09a9dbb55996e30e89.PNGe74eedb5913d4fa9bb431b10bf5a9ecd.PNG15669f1ebfbb4b97a1b23f5c97bbcc9c.PNG

Кто может помочь разобраться? Заранее спасибо!
  • Вопрос задан
  • 356 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
15432
@15432
Системный программист ^_^
Уязвимого места как раз-таки нет, strcpy_s проверяет размер строки и в случае недостаточной длины буфера выкидывает сообщение об ошибке (при помощи assert). Максимум, что увидите - проверку длины и переход в вызов ошибки. При использовании небезопасной функции strcpy наоборот, ошибка при вызове возникать не будет, зато после strcpy программа, скорее всего, выдаст ошибку о повреждении стека, потому что strcpy перезаписала часть служебных данных. Access Violation происходит при обращении по неверному адресу, куда доступа программа не имеет. Статически и динамически выделенные массивы данных будут находиться в стеке или куче, то есть при переполнении и выходе адреса за диапазон массива, произойдёт обращение к другим структурам, также находящимся в куче, но адрес будет по-прежнему корректным. Чтоб получить Access Violation, нужно уйти уж очень далеко за пределы вашего массива.
Если у вас есть исходный код проекта, в той же Visual Studio отлаживать гораздо проще.
Ответ написан
Комментировать
@NastyaG Автор вопроса
Спасибо за ответ .А если все же использовать код:
char buf[3];
strcpy(buf,argv[1]);


Как в Visual Studio лучше делать отладку, чтобы посмотреть, на каком адресе произошло переполнение стека?
Пробую ставить точку останова на вызове функции:
50115bb41a734f87bb5f9b2ab816b23a.PNG
Что означает -52 М ?
Ответ написан
Комментировать
@maks00x
Ты забыл оставить место на нулевой символ — знак окончания строки. Всё, что было нужно, так это написать:
#include "stdafx.h"
#include
using namespace std;
int main(int argc, char *argv[]) {
char buf[3];
strcpy_s(buf, sizeof(buf) - 1, argv[1]);
return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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