gokernel
(usa Linux Mint)
Enviado em 21/06/2019 - 11:40h
Olá pessoal !
Neste momento estou esperando o almoço ficar pronto ... então corri para postar esse:
Talvez alguém esteja se perguntando sobre o último comentário meu ... Porque ao chamar no shell o comando ( call_hello ) logo em seguida acontece a "proteção" ???
Explicando:
De propósito eu executo um ( JIT ) com bug:
// JIT COM BUG DE PROPÓSITO ...
#define LONG_TO_BYTE(l) l, (l >> 8), (l >> 16), (l >> 24)
void call_hello (void) {
long l = &hello;
unsigned char code[] = {
0x55, // push %ebp
0x89, 0xe5, // mov %esp,%ebp
// ... no setup %esp stack ...
// BUG AQUI DE PROP[OSITO... pois precisa setar a PILHA:
// PASS ARGUMENT ... QUEBRA ...
//
// c7 04 24 dc 05 00 00 movl $0x5dc,(%esp)
0xc7, 0x04, 0x24, 0xdc, 0x05, 0x00, 0x00,
// call hello()
//-----------------------------
0xb8, LONG_TO_BYTE(l),
0xff, 0xd0,
//-----------------------------
0xc9, // leave
0xc3 // ret
};
( (void(*)()) code ) ();
}
// JIT SEM BUG: arquivo ( src/kernel.c )
#define LONG_TO_BYTE(l) l, (l >> 8), (l >> 16), (l >> 24)
void call_hello (void) {
long l = &hello;
unsigned char code[] = {
0x55, // push %ebp
0x89, 0xe5, // mov %esp,%ebp
// BUG RESOLVIDO AGORA ...
//---------------------------------
// sub $0x8,%esp
0x83, 0xec, 0x08,
//---------------------------------
// PASS ARGUMENT ... 1500
//
// c7 04 24 dc 05 00 00 movl $0x5dc,(%esp)
0xc7, 0x04, 0x24, 0xdc, 0x05, 0x00, 0x00,
// call hello()
//-----------------------------
0xb8, LONG_TO_BYTE(l),
0xff, 0xd0,
//-----------------------------
0xc9, // leave
0xc3 // ret
};
( (void(*)()) code ) ();
}
Alguma dúvida ???
O meu objetivo agora é fazer um ( Segment Fault ) e continuar com a execução do OS sem "paralisar" ...
Como vou fazer isso ?
rassrsasr ... sei lá ;)