예제 #1
0
파일: asm_test.c 프로젝트: arkanis/lagrange
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);
}
예제 #2
0
파일: asm_test.c 프로젝트: arkanis/lagrange
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);
}
예제 #3
0
파일: asm_test.c 프로젝트: arkanis/lagrange
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);
}
예제 #4
0
파일: asm_test.c 프로젝트: arkanis/lagrange
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);
}
예제 #5
0
파일: ds_init.c 프로젝트: Kampbell/ISODE
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);

}