/*
* Defcon Quals 2013 - incest
*
* ELF binary - sis , reverse to C
* by timhsu@chroot.org, June 2013
*
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
#include <sys/mman.h>
#include <sched.h>
void quit(int n)
{
exit(0);
}
int main(int argc, char *argv[])
{
struct stat buf;
void (*func)();
char *key_buffer;
char *sock_buffer;
int key_fd;
int sock_fd;
signal(SIGCHLD, SIG_IGN);
signal(SIGALRM, quit);
alarm(15);
key_fd = atoi(argv[1]);
sock_fd = atoi(argv[2]);
if (!fork()) {
close(key_fd);
sock_buffer = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
recv(sock_fd, sock_buffer, 512, 0);
func = sock_buffer;
func();
}
close(sock_fd);
fstat(key_fd, &buf);
key_buffer = calloc(1, buf.st_size);
read(key_fd, key_buffer, buf.st_size);
yield:
sched_yield();
goto yield;
}