view target-utils/tf-breakin/mkembed.c @ 461:10e168596dfd

doc/SIM-hardware-debugging: article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 10 Feb 2019 20:40:56 +0000
parents e7502631a0f9
children
line wrap: on
line source

#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define	PAYLOAD_SIZE	116
u_char payload_buf[PAYLOAD_SIZE];

read_binary(filename)
	char *filename;
{
	int fd;
	struct stat st;

	fd = open(filename, O_RDONLY);
	if (fd < 0) {
		perror(filename);
		exit(1);
	}
	fstat(fd, &st);
	if (!S_ISREG(st.st_mode)) {
		fprintf(stderr, "error: %s is not a regular file\n", filename);
		exit(1);
	}
	if (st.st_size != PAYLOAD_SIZE) {
		fprintf(stderr, "error: %s size mismatch\n", filename);
		exit(1);
	}
	if (read(fd, payload_buf, PAYLOAD_SIZE) != PAYLOAD_SIZE) {
		perror("read error");
		exit(1);
	}
	close(fd);
}

write_output(filename)
	char *filename;
{
	FILE *of;
	int i, j, idx;

	of = fopen(filename, "w");
	if (!of) {
		perror(filename);
		exit(1);
	}
	fprintf(of, "u_char shellcode[%d] = {\n", PAYLOAD_SIZE);
	idx = 0;
	for (i = 0; i < 15; i++) {
		for (j = 0; j < 8; j++) {
			if (j)
				putc(' ', of);
			else
				putc('\t', of);
			fprintf(of, "0x%02X,", payload_buf[idx++]);
			if (idx >= PAYLOAD_SIZE)
				break;
		}
		putc('\n', of);
	}
	fputs("};\n", of);
	fclose(of);
}

main(argc, argv)
	char **argv;
{
	if (argc != 3) {
		fprintf(stderr, "usage: %s payload.bin output.c\n", argv[0]);
		exit(1);
	}
	read_binary(argv[1]);
	write_output(argv[2]);
	exit(0);
}