2014-10-31 2 views
1

Я экспериментирую с шеллкодеком, прежде чем углубляться в него, поэтому я наткнулся на пример из руководства по shellcoders. Пример следующий:ошибка сегментации при запуске shellcode

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4 
\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69 
\x6e\x2f\x73\x68"; 

int main() { 

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

Школьный код должен порождать оболочку. Однако я получаю ошибку ошибки сегментации. Я скомпилировал программу, используя gcc компилятор с -fno-stack-protector и -z execstack. Я взял быстрый взгляд на команду readelf, и было ясно, что стек является исполняемым

GNU_STACK  0x000000 0x00000000 0x00000000 0x00000 0x00000 RWE 0x4 
+0

Обратные ссылки служат для цитирования кода, а не для того, чтобы добавить акцент. –

ответ

2

ret является указателем, и это не указывает на любую ячейку памяти, когда вы объявляете его. Позже вы пытаетесь присвоить какое-то значение для него путем добавления 2 к месту указателя, указывающий на. (Что противоречит утверждению)

ret = (int *)&ret + 2;/* Which is wrong */ 
+0

Правда. Теперь ясно. Вот почему вам всегда нужен кто-то другой, чтобы читать то, что вы пишете, потому что он просто увидит ваши ошибки, которые вы просто упускаете при каждом повторном чтении кода. –

+0

Я отклонил этот ответ. Код вопроса предназначен для перезаписывания обратного адреса с адресом 'shellcode'; это не случайное неопределенное поведение. (И, очевидно, это не должно быть портативным или стандартно-совместимым C) – immibis

+0

@immibis вы хотели бы ответить на вопрос? –

0

компилирует следующий код, используя команду «GCC filename.cpp». Ti скомпилирован без ошибок. Надеюсь, это поможет вам решить ваши сомнения.

#include<stdio.h> 

char shellcode[] = "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x4\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68"; 

int main() { 

int *ret; 
ret = (int *) ret + 2; //I don't know why you had written this 
ret = (int *)shellcode; 

} 
Смежные вопросы