mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-08 08:11:34 +00:00
82 lines
1.7 KiB
C
82 lines
1.7 KiB
C
#include <radamsa.h>
|
|
#include <stdio.h>
|
|
#include <inttypes.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
#include <unistd.h>
|
|
#include <sys/stat.h>
|
|
|
|
size_t filesize(char *filename) {
|
|
|
|
struct stat st;
|
|
stat(filename, &st);
|
|
return st.st_size;
|
|
|
|
}
|
|
|
|
#define BUFSIZE 1024 * 1024
|
|
|
|
void fail(char *why) {
|
|
|
|
printf("fail: %s\n", why);
|
|
exit(1);
|
|
|
|
}
|
|
|
|
void write_output(char *data, size_t len, int num) {
|
|
|
|
char path[32];
|
|
int fd;
|
|
int wrote;
|
|
sprintf(path, "/tmp/libradamsa-%d.fuzz", num);
|
|
fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
|
|
printf("Opened %s -> %d\n", path, fd);
|
|
if (fd < 0) { fail("failed to open output file"); }
|
|
wrote = write(fd, data, len);
|
|
printf("wrote %d of %zu bytes\n", wrote, len);
|
|
if (wrote != len) { fail("failed to write all of output at once"); }
|
|
close(fd);
|
|
printf("Wrote %zu bytes to %s\n", len, path);
|
|
|
|
}
|
|
|
|
int main(int nargs, char **argv) {
|
|
|
|
char * spath = argv[1];
|
|
int fd = open(spath, O_RDONLY, 0);
|
|
size_t len;
|
|
char * input;
|
|
char * output;
|
|
int seed = 0;
|
|
if (fd < 0) { fail("cannot open input file"); }
|
|
len = filesize(spath);
|
|
input = malloc(len);
|
|
output = malloc(BUFSIZE);
|
|
if (!input || !output) { fail("failed to allocate buffers\n"); }
|
|
radamsa_init();
|
|
if (len != read(fd, input, len)) {
|
|
|
|
fail("failed to read the entire sample at once");
|
|
|
|
}
|
|
|
|
while (seed++ < 100) {
|
|
|
|
size_t n;
|
|
n = radamsa((uint8_t *)input, len, (uint8_t *)output, BUFSIZE, seed);
|
|
write_output(output, n, seed);
|
|
printf("Fuzzed %zu -> %zu bytes\n", len, n);
|
|
|
|
}
|
|
|
|
printf("library test passed\n");
|
|
free(output);
|
|
free(input);
|
|
return 0;
|
|
|
|
}
|
|
|