Shellcode в C-что это значит?
Я действительно не понимаю, как этот код делает то, что он делает:
char shellcode[] = "xbbx00x00x00x00"
"xb8x01x00x00x00"
"xcdx80";
int main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
}
ладно, я знаю:
int *ret;
устанавливает указатель int. и:
ret = (int *)&ret + 2;
устанавливает адрес ret и 2 байта (я думаю.)
но я не понимаю, что это значит:
(int *)&ret
Я знаю &ret
означает, но не то, что (int *)&ret
средства.
Кроме того, как он выполняет shellcode, назначая значение shellcode
в ret
?
обновление: В чем разница между:
(int *)&ret + 2
и:
&ret + 2
1 ответов
в строку shellcode
содержит какой-то машинный код.
на int *ret;
определяет переменную ret
, который является указателем на int
.
задание ret = (int *)&ret + 2;
делает ret
укажите местоположение размером два int
из собственного фактического местоположения (или адреса); это адрес в стеке, предположительно, где обратный адрес функции (main()
) хранится в стеке.
задание *ret = (int)shellcode;
присваивает адрес кода оболочки на обратный адрес. Поэтому, когда main()
функция выходит, обратный адрес-это код оболочки, который делает все, что он делает, а не выходит из программы нормально.
гипс покрывает множество грехов. Код делает большое количество непереносимых предположений, которые, вероятно, оправданы в целевой среде, но не обязательно где-либо еще.
в чем разница между:
&ret+2
и(int *)&ret + 2
?
тип, в основном; это один из множества грехов, упомянутых ранее. &ret
тип int **
(указатель на указатель на int
) вместо int *
что то типа . С sizeof(int *) == sizeof(int **)
на всех реальных машинах приведение просто подавляет жалобу компилятора (о назначении неправильного типа указателя на ret
) без изменения числового результата.