1 /* 2 * check_initial_reg_state.c - check that execve sets the correct state 3 * Copyright (c) 2014-2016 Andrew Lutomirski 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms and conditions of the GNU General Public License, 7 * version 2, as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * General Public License for more details. 13 */ 14 15 #define _GNU_SOURCE 16 17 #include <stdio.h> 18 19 unsigned long ax, bx, cx, dx, si, di, bp, sp, flags; 20 unsigned long r8, r9, r10, r11, r12, r13, r14, r15; 21 22 asm ( 23 ".pushsection .text\n\t" 24 ".type real_start, @function\n\t" 25 ".global real_start\n\t" 26 "real_start:\n\t" 27 #ifdef __x86_64__ 28 "mov %rax, ax\n\t" 29 "mov %rbx, bx\n\t" 30 "mov %rcx, cx\n\t" 31 "mov %rdx, dx\n\t" 32 "mov %rsi, si\n\t" 33 "mov %rdi, di\n\t" 34 "mov %rbp, bp\n\t" 35 "mov %rsp, sp\n\t" 36 "mov %r8, r8\n\t" 37 "mov %r9, r9\n\t" 38 "mov %r10, r10\n\t" 39 "mov %r11, r11\n\t" 40 "mov %r12, r12\n\t" 41 "mov %r13, r13\n\t" 42 "mov %r14, r14\n\t" 43 "mov %r15, r15\n\t" 44 "pushfq\n\t" 45 "popq flags\n\t" 46 #else 47 "mov %eax, ax\n\t" 48 "mov %ebx, bx\n\t" 49 "mov %ecx, cx\n\t" 50 "mov %edx, dx\n\t" 51 "mov %esi, si\n\t" 52 "mov %edi, di\n\t" 53 "mov %ebp, bp\n\t" 54 "mov %esp, sp\n\t" 55 "pushfl\n\t" 56 "popl flags\n\t" 57 #endif 58 "jmp _start\n\t" 59 ".size real_start, . - real_start\n\t" 60 ".popsection"); 61 62 int main() 63 { 64 int nerrs = 0; 65 66 if (sp == 0) { 67 printf("[FAIL]\tTest was built incorrectly\n"); 68 return 1; 69 } 70 71 if (ax || bx || cx || dx || si || di || bp 72 #ifdef __x86_64__ 73 || r8 || r9 || r10 || r11 || r12 || r13 || r14 || r15 74 #endif 75 ) { 76 printf("[FAIL]\tAll GPRs except SP should be 0\n"); 77 #define SHOW(x) printf("\t" #x " = 0x%lx\n", x); 78 SHOW(ax); 79 SHOW(bx); 80 SHOW(cx); 81 SHOW(dx); 82 SHOW(si); 83 SHOW(di); 84 SHOW(bp); 85 SHOW(sp); 86 #ifdef __x86_64__ 87 SHOW(r8); 88 SHOW(r9); 89 SHOW(r10); 90 SHOW(r11); 91 SHOW(r12); 92 SHOW(r13); 93 SHOW(r14); 94 SHOW(r15); 95 #endif 96 nerrs++; 97 } else { 98 printf("[OK]\tAll GPRs except SP are 0\n"); 99 } 100 101 if (flags != 0x202) { 102 printf("[FAIL]\tFLAGS is 0x%lx, but it should be 0x202\n", flags); 103 nerrs++; 104 } else { 105 printf("[OK]\tFLAGS is 0x202\n"); 106 } 107 108 return nerrs ? 1 : 0; 109 } 110