Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  syscall_nt.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-only
/*
 * syscall_nt.c - checks syscalls with NT set
 * Copyright (c) 2014-2015 Andrew Lutomirski
 *
 * Some obscure user-space code requires the ability to make system calls
 * with FLAGS.NT set.  Make sure it works.
 */


#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <err.h>
#include <sys/syscall.h>

#include "helpers.h"

static unsigned int nerrs;

static void sigtrap(int sig, siginfo_t *si, void *ctx_void)
{
}

static void do_it(unsigned long extraflags)
{
 unsigned long flags;

 set_eflags(get_eflags() | extraflags);
 syscall(SYS_getpid);
 flags = get_eflags();
 set_eflags(X86_EFLAGS_IF | X86_EFLAGS_FIXED);
 if ((flags & extraflags) == extraflags) {
  printf("[OK]\tThe syscall worked and flags are still set\n");
 } else {
  printf("[FAIL]\tThe syscall worked but flags were cleared (flags = 0x%lx but expected 0x%lx set)\n",
         flags, extraflags);
  nerrs++;
 }
}

int main(void)
{
 printf("[RUN]\tSet NT and issue a syscall\n");
 do_it(X86_EFLAGS_NT);

 printf("[RUN]\tSet AC and issue a syscall\n");
 do_it(X86_EFLAGS_AC);

 printf("[RUN]\tSet NT|AC and issue a syscall\n");
 do_it(X86_EFLAGS_NT | X86_EFLAGS_AC);

 /*
 * Now try it again with TF set -- TF forces returns via IRET in all
 * cases except non-ptregs-using 64-bit full fast path syscalls.
 */


 sethandler(SIGTRAP, sigtrap, 0);

 printf("[RUN]\tSet TF and issue a syscall\n");
 do_it(X86_EFLAGS_TF);

 printf("[RUN]\tSet NT|TF and issue a syscall\n");
 do_it(X86_EFLAGS_NT | X86_EFLAGS_TF);

 printf("[RUN]\tSet AC|TF and issue a syscall\n");
 do_it(X86_EFLAGS_AC | X86_EFLAGS_TF);

 printf("[RUN]\tSet NT|AC|TF and issue a syscall\n");
 do_it(X86_EFLAGS_NT | X86_EFLAGS_AC | X86_EFLAGS_TF);

 /*
 * Now try DF.  This is evil and it's plausible that we will crash
 * glibc, but glibc would have to do something rather surprising
 * for this to happen.
 */

 printf("[RUN]\tSet DF and issue a syscall\n");
 do_it(X86_EFLAGS_DF);

 printf("[RUN]\tSet TF|DF and issue a syscall\n");
 do_it(X86_EFLAGS_TF | X86_EFLAGS_DF);

 return nerrs == 0 ? 0 : 1;
}

Messung V0.5
C=94 H=96 G=94

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge