Я написал этот код, чтобы посмотреть, смогу ли я изменить переменную 'target' с помощью атаки форматной строки в x64.
#include<stdio.h>
int target;
int main(int argc , char **argv)
{
printf(argv[1]);
printf("\n\nTarget variable is at: %p" , &target);
if(target)
printf("Target Modified!");
return 0;
}
Поскольку каждое слово в x64 имеет размер 8 байтов, адрес целевой переменной должен быть записан в виде 8 байтов.
Но здесь проблема в том, что адрес целевой переменной равен
0x555555755034 (в форме 0xAABBCCDDEEFF)
, но так как размер слова составляет 8 байтов, я должен написатьэтот адрес что-то вроде
0x0000555555755034 (в форме 0x0000AABBCCDDEEFF).
, но когда я выполнил следующую команду, чтобы увидеть, где целевая переменная находится в стеке, я увидел, что она всегда присутствуетс некоторыми другими шестнадцатеричными цифрами, такими как 5ecdAABBCCDDEEFF.
./code $(python -c 'print "\x34\x50\x75\x55\x55\x55"+"-%p"*131')
Чтобы сформировать правильный адрес, я попытался добавить две "\ 00" перед целевым адресом, например
./code $(python -c 'print "\x34\x50\x75\x55\x55\x55\x00\x00"+"-%p"*131')
, нотерминал жаловался, что \ x00 будет игнорироваться, поскольку он завершает строку.
Поэтому мой вопрос: как мне написать адрес, который выглядит как 0xAABBCCDDEEFF, но присутствует в слове с другими шестнадцатеричными цифрами, такими как 0xed4cAABBCCDDEEFF.
Буду рад, если кто-нибудь сможет помочь.Пожалуйста, прокомментируйте, если я вам не понятен!