void test_instructions_for_if_and_backpatching() { int status_code; asm_p as = &(asm_t){ 0 }; asm_slot_t to_false_case, to_end; as_mov(as, RAX, as_imm(8, 0)); as_cmp(as, RAX, as_imm(8, 0)); to_false_case = as_jmp_cc(as, CC_NOT_EQUAL, as_disp(0)); as_mov(as, R15, as_imm(8, 43)); to_end = as_jmp(as, as_disp(0)); as_patch_slot(as, to_false_case, as_next_instr_offset(as)); as_mov(as, R15, as_imm(8, 17)); as_patch_slot(as, to_end, as_next_instr_offset(as)); as_mov(as, RAX, as_imm(8, 60)); as_mov(as, RDI, R15); as_syscall(as); as_save_elf(as, 4 * 1024 * 1024, 512 * 1024 * 1024, "test_instructions_for_if_true.elf"); as_free(as); status_code = run_and_delete("test_instructions_for_if_true.elf", "./test_instructions_for_if_true.elf", NULL); st_check_int(status_code, 43); as_mov(as, RAX, as_imm(8, 5)); as_cmp(as, RAX, as_imm(8, 0)); to_false_case = as_jmp_cc(as, CC_NOT_EQUAL, as_disp(0)); as_mov(as, R15, as_imm(8, 43)); to_end = as_jmp(as, as_disp(0)); as_patch_slot(as, to_false_case, as_next_instr_offset(as)); as_mov(as, R15, as_imm(8, 17)); as_patch_slot(as, to_end, as_next_instr_offset(as)); as_mov(as, RAX, as_imm(8, 60)); as_mov(as, RDI, R15); as_syscall(as); as_save_elf(as, 4 * 1024 * 1024, 512 * 1024 * 1024, "test_instructions_for_if_false.elf"); as_free(as); status_code = run_and_delete("test_instructions_for_if_false.elf", "./test_instructions_for_if_false.elf", NULL); st_check_int(status_code, 17); }
void test_instructions_for_if() { asm_p as = &(asm_t){ 0 }; as_new(as); asm_jump_slot_t to_false_case, to_end; as_mov(as, RAX, imm(0)); as_cmp(as, RAX, imm(0)); to_false_case = as_jmp_cc(as, CC_NOT_EQUAL, 0); as_mov(as, R15, imm(43)); to_end = as_jmp(as, reld(0)); as_mark_jmp_slot_target(as, to_false_case); as_mov(as, R15, imm(17)); as_mark_jmp_slot_target(as, to_end); as_mov(as, RAX, imm(60)); as_mov(as, RDI, R15); as_syscall(as); as_save_elf(as, "test_instructions_for_if_true.elf"); as_clear(as); as_mov(as, RAX, imm(5)); as_cmp(as, RAX, imm(0)); to_false_case = as_jmp_cc(as, CC_NOT_EQUAL, 0); as_mov(as, R15, imm(43)); to_end = as_jmp(as, reld(0)); as_mark_jmp_slot_target(as, to_false_case); as_mov(as, R15, imm(17)); as_mark_jmp_slot_target(as, to_end); as_mov(as, RAX, imm(60)); as_mov(as, RDI, R15); as_syscall(as); as_save_elf(as, "test_instructions_for_if_false.elf"); as_destroy(as); int status_code; status_code = run_and_delete("test_instructions_for_if_true.elf", "./test_instructions_for_if_true.elf", NULL); st_check_int(status_code, 43); status_code = run_and_delete("test_instructions_for_if_false.elf", "./test_instructions_for_if_false.elf", NULL); st_check_int(status_code, 17); }
void test_byte_registers() { asm_p as = &(asm_t){ 0 }; char* disassembly = NULL; as_new(as); // reg reg as_clear(as); for(size_t i = 0; i < 16; i++) as_mov(as, regb(i), regb(i)); disassembly = disassemble(as); st_check_str(disassembly, "mov al,al\n" "mov cl,cl\n" "mov dl,dl\n" "mov bl,bl\n" "mov spl,spl\n" "mov bpl,bpl\n" "mov sil,sil\n" "mov dil,dil\n" "mov r8b,r8b\n" "mov r9b,r9b\n" "mov r10b,r10b\n" "mov r11b,r11b\n" "mov r12b,r12b\n" "mov r13b,r13b\n" "mov r14b,r14b\n" "mov r15b,r15b\n" ); // reg [RIP + displ] as_clear(as); for(size_t i = 0; i < 16; i++) as_mov(as, regb(i), reldb(0x7abbccdd)); disassembly = disassemble(as); st_check_str(disassembly, "mov al,BYTE PTR [rip+0x7abbccdd] # 0x7afbcce4\n" "mov cl,BYTE PTR [rip+0x7abbccdd] # 0x7afbcceb\n" "mov dl,BYTE PTR [rip+0x7abbccdd] # 0x7afbccf2\n" "mov bl,BYTE PTR [rip+0x7abbccdd] # 0x7afbccf9\n" "mov spl,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd00\n" "mov bpl,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd07\n" "mov sil,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd0e\n" "mov dil,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd15\n" "mov r8b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd1c\n" "mov r9b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd23\n" "mov r10b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd2a\n" "mov r11b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd31\n" "mov r12b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd38\n" "mov r13b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd3f\n" "mov r14b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd46\n" "mov r15b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd4d\n" ); // reg [displ] as_clear(as); for(size_t i = 0; i < 16; i++) as_mov(as, regb(i), memdb(0x7abbccdd)); disassembly = disassemble(as); st_check_str(disassembly, "mov al,BYTE PTR ds:0x7abbccdd\n" "mov cl,BYTE PTR ds:0x7abbccdd\n" "mov dl,BYTE PTR ds:0x7abbccdd\n" "mov bl,BYTE PTR ds:0x7abbccdd\n" "mov spl,BYTE PTR ds:0x7abbccdd\n" "mov bpl,BYTE PTR ds:0x7abbccdd\n" "mov sil,BYTE PTR ds:0x7abbccdd\n" "mov dil,BYTE PTR ds:0x7abbccdd\n" "mov r8b,BYTE PTR ds:0x7abbccdd\n" "mov r9b,BYTE PTR ds:0x7abbccdd\n" "mov r10b,BYTE PTR ds:0x7abbccdd\n" "mov r11b,BYTE PTR ds:0x7abbccdd\n" "mov r12b,BYTE PTR ds:0x7abbccdd\n" "mov r13b,BYTE PTR ds:0x7abbccdd\n" "mov r14b,BYTE PTR ds:0x7abbccdd\n" "mov r15b,BYTE PTR ds:0x7abbccdd\n" ); // reg [reg + displ] as_clear(as); for(size_t i = 0; i < 16; i++) as_mov(as, regb(i), memrdb(reg(i), 0x7abbccdd)); disassembly = disassemble(as); st_check_str(disassembly, "mov al,BYTE PTR [rax+0x7abbccdd]\n" "mov cl,BYTE PTR [rcx+0x7abbccdd]\n" "mov dl,BYTE PTR [rdx+0x7abbccdd]\n" "mov bl,BYTE PTR [rbx+0x7abbccdd]\n" "mov spl,BYTE PTR [rsp+0x7abbccdd]\n" "mov bpl,BYTE PTR [rbp+0x7abbccdd]\n" "mov sil,BYTE PTR [rsi+0x7abbccdd]\n" "mov dil,BYTE PTR [rdi+0x7abbccdd]\n" "mov r8b,BYTE PTR [r8+0x7abbccdd]\n" "mov r9b,BYTE PTR [r9+0x7abbccdd]\n" "mov r10b,BYTE PTR [r10+0x7abbccdd]\n" "mov r11b,BYTE PTR [r11+0x7abbccdd]\n" "mov r12b,BYTE PTR [r12+0x7abbccdd]\n" "mov r13b,BYTE PTR [r13+0x7abbccdd]\n" "mov r14b,BYTE PTR [r14+0x7abbccdd]\n" "mov r15b,BYTE PTR [r15+0x7abbccdd]\n" ); as_clear(as); for(size_t i = 0; i < 16; i++) as_mul(as, regb(i)); disassembly = disassemble(as); st_check_str(disassembly, "mul al\n" "mul cl\n" "mul dl\n" "mul bl\n" "mul spl\n" "mul bpl\n" "mul sil\n" "mul dil\n" "mul r8b\n" "mul r9b\n" "mul r10b\n" "mul r11b\n" "mul r12b\n" "mul r13b\n" "mul r14b\n" "mul r15b\n" ); as_clear(as); for(size_t i = 0; i < 16; i++) as_cmp(as, regb(i), regb(i)); disassembly = disassemble(as); st_check_str(disassembly, "cmp al,al\n" "cmp cl,cl\n" "cmp dl,dl\n" "cmp bl,bl\n" "cmp spl,spl\n" "cmp bpl,bpl\n" "cmp sil,sil\n" "cmp dil,dil\n" "cmp r8b,r8b\n" "cmp r9b,r9b\n" "cmp r10b,r10b\n" "cmp r11b,r11b\n" "cmp r12b,r12b\n" "cmp r13b,r13b\n" "cmp r14b,r14b\n" "cmp r15b,r15b\n" ); as_clear(as); for(size_t i = 0; i < 16; i++) as_cmp(as, regb(i), reldb(0x7abbccdd)); disassembly = disassemble(as); st_check_str(disassembly, "cmp al,BYTE PTR [rip+0x7abbccdd] # 0x7afbcce4\n" "cmp cl,BYTE PTR [rip+0x7abbccdd] # 0x7afbcceb\n" "cmp dl,BYTE PTR [rip+0x7abbccdd] # 0x7afbccf2\n" "cmp bl,BYTE PTR [rip+0x7abbccdd] # 0x7afbccf9\n" "cmp spl,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd00\n" "cmp bpl,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd07\n" "cmp sil,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd0e\n" "cmp dil,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd15\n" "cmp r8b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd1c\n" "cmp r9b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd23\n" "cmp r10b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd2a\n" "cmp r11b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd31\n" "cmp r12b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd38\n" "cmp r13b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd3f\n" "cmp r14b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd46\n" "cmp r15b,BYTE PTR [rip+0x7abbccdd] # 0x7afbcd4d\n" ); free(disassembly); }
void test_compare_instructions() { asm_p as = &(asm_t){ 0 }; char* disassembly = NULL; as_new(as); as_clear(as); for(size_t i = 0; i < 16; i++) as_cmp(as, reg(i), reg(i)); disassembly = disassemble(as); st_check_str(disassembly, "cmp rax,rax\n" "cmp rcx,rcx\n" "cmp rdx,rdx\n" "cmp rbx,rbx\n" "cmp rsp,rsp\n" "cmp rbp,rbp\n" "cmp rsi,rsi\n" "cmp rdi,rdi\n" "cmp r8,r8\n" "cmp r9,r9\n" "cmp r10,r10\n" "cmp r11,r11\n" "cmp r12,r12\n" "cmp r13,r13\n" "cmp r14,r14\n" "cmp r15,r15\n" ); as_clear(as); for(size_t i = 0; i < 16; i++) as_cmp(as, reg(i), memrd(reg(i), 0xbeba)); disassembly = disassemble(as); st_check_str(disassembly, "cmp rax,QWORD PTR [rax+0xbeba]\n" "cmp rcx,QWORD PTR [rcx+0xbeba]\n" "cmp rdx,QWORD PTR [rdx+0xbeba]\n" "cmp rbx,QWORD PTR [rbx+0xbeba]\n" "cmp rsp,QWORD PTR [rsp+0xbeba]\n" "cmp rbp,QWORD PTR [rbp+0xbeba]\n" "cmp rsi,QWORD PTR [rsi+0xbeba]\n" "cmp rdi,QWORD PTR [rdi+0xbeba]\n" "cmp r8,QWORD PTR [r8+0xbeba]\n" "cmp r9,QWORD PTR [r9+0xbeba]\n" "cmp r10,QWORD PTR [r10+0xbeba]\n" "cmp r11,QWORD PTR [r11+0xbeba]\n" "cmp r12,QWORD PTR [r12+0xbeba]\n" "cmp r13,QWORD PTR [r13+0xbeba]\n" "cmp r14,QWORD PTR [r14+0xbeba]\n" "cmp r15,QWORD PTR [r15+0xbeba]\n" ); as_clear(as); for(size_t i = 0; i < 16; i++) as_cmp(as, reg(i), imm(0x11223344)); disassembly = disassemble(as); st_check_str(disassembly, "cmp rax,0x11223344\n" "cmp rcx,0x11223344\n" "cmp rdx,0x11223344\n" "cmp rbx,0x11223344\n" "cmp rsp,0x11223344\n" "cmp rbp,0x11223344\n" "cmp rsi,0x11223344\n" "cmp rdi,0x11223344\n" "cmp r8,0x11223344\n" "cmp r9,0x11223344\n" "cmp r10,0x11223344\n" "cmp r11,0x11223344\n" "cmp r12,0x11223344\n" "cmp r13,0x11223344\n" "cmp r14,0x11223344\n" "cmp r15,0x11223344\n" ); free(disassembly); }
dsa_init () { Attr_Sequence as, get_cacheEDB(); AttributeType manager; DN str2dn(); struct edb_info * dsainfo; AV_Sequence avs; Entry newentry; Entry my_entry; int real_unravel_attribute (); int real_check_schema (); char loadstate = TRUE; struct DSError error; Entry akid; check_dsa_known_oids (); unrav_fn = (IFP) real_unravel_attribute; schema_fn = (IFP) real_check_schema; restart_fn = (IFP) attempt_restart; if (( manager = AttrT_new (MANAGER_OID)) == NULLAttrT) fatal (-1,"Manager - unknown attribute - check oid tables"); LLOG (log_dsap,LLOG_NOTICE,("dsa name %s",mydsaname)); if ((mydsadn = str2dn (mydsaname)) == NULLDN) { fatal (-2,"Invalid dsa name"); } if ((my_entry = load_dsa_cache_entry (mydsadn)) == NULLENTRY) { if (parse_status != 0) fatal (-3,"Can't load EDB subtree holding my DSA entry"); if (database_root != NULLENTRY) fatal (-4,"Found EDB - but my DSA entry not in it!"); fatal (-4,"can't locate my DSA entry in local database!"); } else if (my_entry->e_data == E_TYPE_CACHE_FROM_MASTER) shadow_myentry (); if (get_entry_passwd (my_entry->e_attributes) == NULLCP) /* This is not a fatal error, but some remote operations may fail */ LLOG(log_dsap,LLOG_EXCEPTIONS,("Can't find my own PASSWORD")); if (dsa_real_attr) { if (as_cmp (my_entry->e_attributes,dsa_real_attr) != 0) { LLOG (log_dsap,LLOG_EXCEPTIONS, ("DSA.real entry inconsistent with EDB -- problem should fix itself later!")); as_free (my_entry->e_attributes); my_entry->e_attributes = as_cpy (dsa_real_attr); if (unravel_attribute (my_entry,&error) != OK) fatal (-82,"schema error in DSA entry"); } } else dsa_real_attr = as_cpy (my_entry->e_attributes); if (my_entry->e_dsainfo != NULLDSA) { /* get manager attribute */ if ((as = entry_find_type(my_entry,manager)) == NULLATTR ) fatal (-5,"Manager attribute missing in my own entry"); AttrT_free (manager); super_user = avs_cpy ((AV_Sequence)as->attr_value); if (quipu_ctx_supported(my_entry) < 5) { LLOG(log_dsap,LLOG_EXCEPTIONS,( "Adding QUIPU and/or Internet DSP to application context!!!")); set_context (my_entry); } my_entry->e_dsainfo->dsa_version = TidyString (strdup (quipuversion)); if (as = entry_find_type (my_entry,at_version)) if ( strcmp ( (char *) as->attr_value->avseq_av.av_struct, my_entry->e_dsainfo->dsa_version) != 0) { if (as->attr_value->avseq_av.av_struct) free (as->attr_value->avseq_av.av_struct); as->attr_value->avseq_av.av_struct = (caddr_t) strdup (my_entry->e_dsainfo->dsa_version); if (as = as_find_type (dsa_real_attr,at_version)) { if (as->attr_value->avseq_av.av_struct) free (as->attr_value->avseq_av.av_struct); as->attr_value->avseq_av.av_struct = (caddr_t) strdup (my_entry->e_dsainfo->dsa_version); } if (parse_status == 0) if (my_entry->e_data == E_DATA_MASTER) { if (my_entry->e_parent != NULLENTRY) my_entry->e_parent->e_edbversion = new_version(); LLOG (log_dsap,LLOG_NOTICE,("Updating version number")); #ifdef TURBO_DISK if (turbo_write(my_entry) != OK) fatal (-33,"self rewrite failed - check database"); #else akid = (Entry) avl_getone(my_entry->e_parent->e_children); if (journal (akid) != OK) fatal (-33,"self rewrite failed - check database"); #endif } else { write_dsa_entry(my_entry); } } } else fatal (-6,"No edbinfo attribute in my own entry"); if (parse_status != 0) loadstate = FALSE; for (avs = my_entry->e_dsainfo->dsa_attr ; avs != NULLAV; avs=avs->avseq_next) { if (avs->avseq_av.av_struct == NULL) continue; dsainfo = (struct edb_info *) avs->avseq_av.av_struct; if ((newentry = make_path (dsainfo->edb_name)) == NULLENTRY) continue; (void) subtree_load (newentry,dsainfo->edb_name); if (parse_status != 0) loadstate = FALSE; } if (loadstate == FALSE) fatal (-7,"DSA Halted"); if ((akid = (Entry) avl_getone(database_root->e_children)) != NULLENTRY ) database_root->e_data = akid->e_data; /* Load cached EDB files - if any */ if ((as = get_cacheEDB()) != NULLATTR) { (void) time (&timenow); for (avs = as -> attr_value; avs != NULLAV; avs = avs -> avseq_next) { if ((newentry = make_path ((DN)avs->avseq_av.av_struct)) == NULLENTRY) continue; newentry = subtree_load (newentry,(DN)avs->avseq_av.av_struct); /* Should timestamp using version number ! */ if (newentry) newentry->e_age = timenow; } } #ifndef TURBO_DISK free_phylinebuf(); /* Large buffer used in loading text database */ #endif return (OK); }