Это потому, что вы передаете i как указатель, а затем разыменовываете его.Таким образом, вы будете разыменовывать 0x1, адрес, к которому у вас нет прав доступа, и получите SIGSEGV.
Плюс, вы точно не уверены, что вы пытаетесь сделать с этой программой.Функция проверки пароля пытается получить доступ к int как массиву, что не имеет смысла.
Редактировать: с полным кодом это имеет гораздо больше смысла.Программа выполняет следующее: принимает первый аргумент (argv [1]), если его длина равна 20 (иначе говоря, если аргумент представляет собой строку из 20 символов), то он будет передан функции check_password.Теперь вам нужно довольно хорошее знание C, чтобы понять, что происходит.
Указатель на вашу строку, char const *, теперь приводится как указатель на int.Символ всегда один байт.Int обычно 4 байта.Ваша строка символов теперь будет читаться как массив int.
Давайте возьмем строку «test».Он кодируется в памяти следующим образом: 0x74(t) 0x73(s) 0x65(e) 0x74(t)
Вы заметите, что он перевернут.Это связано с тем, что большинство компьютеров в настоящее время имеют порядок байтов (то есть самый большой бит читается первым).Когда эта строка преобразуется как int и access, она будет читаться как int со значением 0x74736574
, иначе 1953719668.
Контрольный пароль повторяется в этом массиве int 5 раз.Он добавит первые 5 целых чисел, которые он читает, что означает, что если мы возьмем следующий пароль: abcdefghijklmnopqrst
, результат будет следующим:
first loop:
res = 0x64636261
second loop:
res += 0x68676665
third loop:
res += 0x72717069
fourth loop:
res += 0x76757473
last loop:
res += 0x7a797877
Ваша цель - достичь значения 0x21DD09EC с паролем,Один из многих возможных ответов будет: 0fwzzzgzabafgccczc9c