Shellcode на C - Что это значит? - PullRequest
15 голосов
/ 22 марта 2012

Я не совсем понимаю, как этот код делает то, что делает:

char shellcode[] = "\xbb\x00\x00\x00\x00"           
                   "\xb8\x01\x00\x00\x00"                  
                   "\xcd\x80";                  

int main()
{
    int *ret;
    ret = (int *)&ret + 2;
    (*ret) = (int)shellcode;
}

Хорошо, я знаю:

int *ret;

устанавливает указатель на int.и:

ret = (int *)&ret + 2;

устанавливает адрес ret и 2 байта (я думаю.)

Но я не понимаю, что это значит:

(int *)&ret

Iзнать, что означает &ret, но не то, что означает (int *)&ret.Кроме того, как он выполняет шелл-код, присваивая значение shellcode ret?

ОБНОВЛЕНИЕ: В чем разница между:

(int *)&ret  + 2

и:

&ret + 2

1 Ответ

16 голосов
/ 22 марта 2012

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

...