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) без изменения числового результата.