Видимо, вы все еще не запускаете выполнение кода, хотя теперь я вижу, где у вас переполнение буфера.Однако обратите внимание, что переполнение переменной buf пытается перезаписать адрес возврата для main, поэтому он должен печатать текст в любом случае.Кроме того, компилятор может сгенерировать компоновку стека, отличную от той, которую вы ожидаете, или, возможно, ваш стек не выполним (хотя в этом случае вы должны получить ошибку по умолчанию).
Используйте отладчик для пошагового выполнения кода, начиная с оператора return в main и смотрите, что происходит.Вы скоро достигнете инструкции RET, которая должна вставить начальный адрес вашего шеллкода в указатель инструкции, эффективно перейдя к нему.Я подозреваю, что по какой-то причине этого не происходит.