binär exec

30/10/2011 - 12:40 von Jens Kallup | Report spam
Hallo,

ok, hab mir daas schon so gedacht, dass das mit ELF so ne Sache ist.
Jetzt habe ich

; s3.asm - nasm -f bin s3.asm -o s3
org 0x400
bits 32

segment .text
start:
push 1
pop eax
mov eax, 70
ret

der obige code geht durch, keine Probleme.
// aber:
org 0x400
bits 32

segment .text
start:
push 1
call 0x401588
ret

// Ergebnis:
# ./test1 s3
exit-> 0x401588
puts-> 0x401590
start...
Segmentation fault (core dumped)


den code habe ich unter cygwin laufen lassen.
Ein gleiches Resultat habe ich unter Linux
(Adressen auch geàndert) - Speicherzugriffsfehler.


#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

extern int errno;
static volatile sig_atomic_t sflag;
static sigset_t signal_neu, signal_alt, signal_leer;
void sigfunc1(int);
void sigfunc2(int);

void signale_mmap(void)
{
if(signal(SIGSEGV, sigfunc1) == SIG_ERR)
{
fprintf(stderr, "Konnte signalhandler für SIGSEGV nicht
einrichten");
exit(0);
}
if(signal(SIGBUS, sigfunc2) == SIG_ERR)
{
fprintf(stderr, "Konnte signalhandler für SIGBUS nicht
einrichten");
exit(0);
}

sigemptyset(&signal_leer);
sigemptyset(&signal_neu);

sigaddset(&signal_neu, SIGSEGV);
sigaddset(&signal_neu, SIGBUS);

if(sigprocmask(SIG_BLOCK, &signal_neu, &signal_alt) < 0)
exit(0);
}

void sigfunc1(int sig)
{
printf("SIGSEGV: Versuch auf einen unerlaubten Speicherbereich zu
schreiben");
exit(0);
}

void sigfunc2(int sig)
{
printf("SIGBUS: Der Speicherbereich ist nicht mehr gültig");
exit(0);
}

int main(int argc, char **argv)
{
int fd,fd1;
//typedef void (*speicherquelle)(int);
//speicherquelle callback;


void (*callback)();
printf("exit-> 0x%x",exit);
printf("puts-> 0x%x",puts);


struct stat attr;

signale_mmap();

if((fd1=open(argv[1],O_RDONLY)) < 0)
{
fprintf(stderr,"%s : Konnte %s nicht
öffnen",strerror(errno),argv[2]);
exit(0);
}

if(fstat(fd1, &attr) == -1)
{
fprintf(stderr,"Fehler bei fstat...");
exit(0);
}

callback = mmap(0, attr.st_size, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE, fd1, 0);
printf("val: %d",callback);
if((callback == ((caddr_t) -1)) )
{
fprintf(stderr, "%s: Fehler bei mmap ...",strerror(errno));
exit(0);
}
close(fd1);

printf("start...");
callback();
printf("ende...");

exit(0);
}


valgrrind: http://codepad.org/wysLeVke

Jemand eine Idee, wie man interne EXE Funktionen
aufrufen kann?

Danke
Jens
 

Lesen sie die antworten

#1 Robert Pichler
30/10/2011 - 16:44 | Warnen spam
Am Sun, 30 Oct 2011 12:40:17 +0100
schrieb Jens Kallup :

; s3.asm - nasm -f bin s3.asm -o s3
exit-> 0x401588


Wie kommst du auf diese Adresse?
Außerdem ist nicht ersichtlich wie du die stdlib gelinkt hast.

Ähnliche fragen