'Строка' 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 *
, который является типом самого ret
. Поскольку sizeof(int *) == sizeof(int **)
на всех реальных машинах, приведение просто подавляет жалобу от компилятора (о назначении неверного типа указателя на ret
) без изменения числового результата.