From 25413752bc675c772af5baeadc5508cd77d4feca Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 11:33:12 +0800 Subject: [PATCH 01/10] add httpd test --- qiling/os/posix/syscall/fcntl.py | 226 ------------------------------- tests/test_elf_multithread.py | 19 +-- tests/test_httpd.py | 19 +++ 3 files changed, 21 insertions(+), 243 deletions(-) create mode 100644 tests/test_httpd.py diff --git a/qiling/os/posix/syscall/fcntl.py b/qiling/os/posix/syscall/fcntl.py index 02e932d6..e69de29b 100644 --- a/qiling/os/posix/syscall/fcntl.py +++ b/qiling/os/posix/syscall/fcntl.py @@ -1,226 +0,0 @@ -#!/usr/bin/env python3 -# -# Cross Platform and Multi Architecture Advanced Binary Emulation Framework -# - -import os - -from qiling import Qiling -from qiling.const import QL_OS, QL_ARCH -from qiling.exception import QlSyscallError -from qiling.os.posix.const import * -from qiling.os.posix.const_mapping import ql_open_flag_mapping -from qiling.os.posix.filestruct import ql_socket - -def ql_syscall_open(ql: Qiling, filename: int, flags: int, mode: int): - path = ql.os.utils.read_cstring(filename) - real_path = ql.os.path.transform_to_real_path(path) - relative_path = ql.os.path.transform_to_relative_path(path) - - flags &= 0xffffffff - mode &= 0xffffffff - - idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) - - if idx == -1: - regreturn = -EMFILE - else: - try: - if ql.archtype== QL_ARCH.ARM and ql.ostype!= QL_OS.QNX: - mode = 0 - - #flags = ql_open_flag_mapping(ql, flags) - flags = ql_open_flag_mapping(ql, flags) - ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(path, flags, mode) - regreturn = idx - except QlSyscallError as e: - regreturn = - e.errno - - - ql.log.debug("open(%s, 0o%o) = %d" % (relative_path, mode, regreturn)) - - if regreturn >= 0 and regreturn != 2: - ql.log.debug(f'File found: {real_path:s}') - else: - ql.log.debug(f'File not found {real_path:s}') - - return regreturn - -def ql_syscall_creat(ql: Qiling, filename: int, mode: int): - flags = posix_open_flags["O_WRONLY"] | posix_open_flags["O_CREAT"] | posix_open_flags["O_TRUNC"] - - path = ql.os.utils.read_cstring(filename) - real_path = ql.os.path.transform_to_real_path(path) - relative_path = ql.os.path.transform_to_relative_path(path) - - flags &= 0xffffffff - mode &= 0xffffffff - - idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) - - if idx == -1: - regreturn = -ENOMEM - else: - try: - if ql.archtype== QL_ARCH.ARM: - mode = 0 - - flags = ql_open_flag_mapping(ql, flags) - ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(path, flags, mode) - regreturn = idx - except QlSyscallError as e: - regreturn = -e.errno - - ql.log.debug("creat(%s, 0o%o) = %d" % (relative_path, mode, regreturn)) - - if regreturn >= 0 and regreturn != 2: - ql.log.debug(f'File found: {real_path:s}') - else: - ql.log.debug(f'File not found {real_path:s}') - - return regreturn - -def ql_syscall_openat(ql: Qiling, fd: int, path: int, flags: int, mode: int): - file_path = ql.os.utils.read_cstring(path) - # real_path = ql.os.path.transform_to_real_path(path) - # relative_path = ql.os.path.transform_to_relative_path(path) - - flags &= 0xffffffff - mode &= 0xffffffff - - idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) - - if idx == -1: - regreturn = -EMFILE - else: - try: - if ql.archtype== QL_ARCH.ARM: - mode = 0 - - flags = ql_open_flag_mapping(ql, flags) - fd = ql.unpacks(ql.pack(fd)) - - if 0 <= fd < NR_OPEN: - dir_fd = ql.os.fd[fd].fileno() - else: - dir_fd = None - - ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(file_path, flags, mode, dir_fd) - - regreturn = idx - except QlSyscallError as e: - regreturn = -e.errno - - ql.log.debug(f'openat(fd = {fd:d}, path = {file_path}, mode = {mode:#o}) = {regreturn:d}') - - return regreturn - - -def ql_syscall_fcntl(ql: Qiling, fd: int, cmd: int, arg: int): - if not (0 <= fd < NR_OPEN) or ql.os.fd[fd] == 0: - return -EBADF - - f = ql.os.fd[fd] - - if cmd == F_DUPFD: - if 0 <= arg < NR_OPEN: - for idx, val in enumerate(ql.os.fd): - if val == 0 and idx >= arg: - new_fd = ql.os.fd[fd].dup() - ql.os.fd[idx] = new_fd - regreturn = idx - break - else: - regreturn = -EMFILE - else: - regreturn = -EINVAL - - elif cmd == F_GETFD: - regreturn = getattr(f, "close_on_exec", 0) - - elif cmd == F_SETFD: - f.close_on_exec = 1 if arg & FD_CLOEXEC else 0 - regreturn = 0 - - elif cmd == F_GETFL: - regreturn = ql.os.fd[fd].fcntl(cmd, arg) - - elif cmd == F_SETFL: - ql.os.fd[fd].fcntl(cmd, arg) - regreturn = 0 - - else: - regreturn = -1 - - return regreturn - - -def ql_syscall_fcntl64(ql: Qiling, fd: int, cmd: int, arg: int): - - # https://linux.die.net/man/2/fcntl64 - if cmd == F_DUPFD: - if 0 <= arg < NR_OPEN and 0 <= fd < NR_OPEN: - if ql.os.fd[fd] != 0: - new_fd = ql.os.fd[fd].dup() - for idx, val in enumerate(ql.os.fd): - if val == 0 and idx >= arg: - ql.os.fd[idx] = new_fd - regreturn = idx - break - else: - regreturn = -1 - else: - regreturn = -1 - - elif cmd == F_GETFL: - regreturn = 2 - - elif cmd == F_SETFL: - if isinstance(ql.os.fd[fd], ql_socket): - ql.os.fd[fd].fcntl(cmd, arg) - regreturn = 0 - - elif cmd == F_GETFD: - regreturn = 2 - - elif cmd == F_SETFD: - regreturn = 0 - - else: - regreturn = 0 - - return regreturn - - -def ql_syscall_flock(ql: Qiling, fd: int, operation: int): - # Should always return 0, we don't need a actual file lock - - return 0 - - -def ql_syscall_rename(ql: Qiling, oldname_buf: int, newname_buf: int): - """ - rename(const char *oldpath, const char *newpath) - description: change the name or location of a file - ret value: On success, zero is returned. On error, -1 is returned - """ - regreturn = 0 # default value is success - oldpath = ql.os.utils.read_cstring(oldname_buf) - newpath = ql.os.utils.read_cstring(newname_buf) - - ql.log.debug(f"rename() path: {oldpath} -> {newpath}") - - old_realpath = ql.os.path.transform_to_real_path(oldpath) - new_realpath = ql.os.path.transform_to_real_path(newpath) - - if old_realpath == new_realpath: - # do nothing, just return success - return regreturn - - try: - os.rename(old_realpath, new_realpath) - except OSError: - ql.log.exception(f"rename(): {newpath} exists!") - regreturn = -1 - - return regreturn diff --git a/tests/test_elf_multithread.py b/tests/test_elf_multithread.py index a625c126..a1d38310 100644 --- a/tests/test_elf_multithread.py +++ b/tests/test_elf_multithread.py @@ -3,7 +3,7 @@ # Cross Platform and Multi Architecture Advanced Binary Emulation Framework # -import platform, sys, unittest, subprocess, string, random, os +import platform, sys, unittest, os, threading from unicorn import UcError, UC_ERR_READ_UNMAPPED, UC_ERR_FETCH_UNMAPPED @@ -283,25 +283,10 @@ class ELFTest(unittest.TestCase): del ql - def test_udp_elf_linux_arm(self): - def check_write(ql, write_fd, write_buf, write_count, *args, **kw): - try: - buf = ql.mem.read(write_buf, write_count) - buf = buf.decode() - if buf.startswith("server sendto()"): - ql.buf_out = buf - except: - pass + - ql = Qiling(["../examples/rootfs/arm_linux/bin/arm_udp_test","20010"], "../examples/rootfs/arm_linux", multithread=True) - ql.set_syscall("write", check_write, QL_INTERCEPT.ENTER) - ql.run() - self.assertEqual("server sendto() 14 return 14.\n", ql.buf_out) - del ql -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_httpd.py b/tests/test_httpd.py new file mode 100644 index 00000000..098ecb46 --- /dev/null +++ b/tests/test_httpd.py @@ -0,0 +1,19 @@ + +import os, socket, threading, requests + +sys.path.append("..") +from qiling import Qiling +from qiling.const import QL_VERBOSE + +def test_http_elf_linux_arm(): + ql = Qiling(["../examples/rootfs/arm_linux/bin/vshttpd","-p","20011","-r","../www"], "../examples/rootfs/arm_linux", multithread=True) + ql.run() + + +if __name__ == "__main__": + test_http_elf_linux_arm_therad = threading.Thread(target=test_http_elf_linux_arm, daemon=True) + test_http_elf_linux_arm_therad.start() + + + r = requests.get('https://localhost:20011/') + print(r.text)[:200] \ No newline at end of file From 0f3d87e12f5383156598fa3d7c6c9cdfea5361d8 Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 11:36:14 +0800 Subject: [PATCH 02/10] update fcntl --- qiling/os/posix/syscall/fcntl.py | 226 +++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) diff --git a/qiling/os/posix/syscall/fcntl.py b/qiling/os/posix/syscall/fcntl.py index e69de29b..e7f51583 100644 --- a/qiling/os/posix/syscall/fcntl.py +++ b/qiling/os/posix/syscall/fcntl.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python3 +# +# Cross Platform and Multi Architecture Advanced Binary Emulation Framework +# + +import os + +from qiling import Qiling +from qiling.const import QL_OS, QL_ARCH +from qiling.exception import QlSyscallError +from qiling.os.posix.const import * +from qiling.os.posix.const_mapping import ql_open_flag_mapping +from qiling.os.posix.filestruct import ql_socket + +def ql_syscall_open(ql: Qiling, filename: int, flags: int, mode: int): + path = ql.os.utils.read_cstring(filename) + real_path = ql.os.path.transform_to_real_path(path) + relative_path = ql.os.path.transform_to_relative_path(path) + + flags &= 0xffffffff + mode &= 0xffffffff + + idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) + + if idx == -1: + regreturn = -EMFILE + else: + try: + if ql.archtype== QL_ARCH.ARM and ql.ostype!= QL_OS.QNX: + mode = 0 + + #flags = ql_open_flag_mapping(ql, flags) + flags = ql_open_flag_mapping(ql, flags) + ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(path, flags, mode) + regreturn = idx + except QlSyscallError as e: + regreturn = - e.errno + + + ql.log.debug("open(%s, 0o%o) = %d" % (relative_path, mode, regreturn)) + + if regreturn >= 0 and regreturn != 2: + ql.log.debug(f'File found: {real_path:s}') + else: + ql.log.debug(f'File not found {real_path:s}') + + return regreturn + +def ql_syscall_creat(ql: Qiling, filename: int, mode: int): + flags = posix_open_flags["O_WRONLY"] | posix_open_flags["O_CREAT"] | posix_open_flags["O_TRUNC"] + + path = ql.os.utils.read_cstring(filename) + real_path = ql.os.path.transform_to_real_path(path) + relative_path = ql.os.path.transform_to_relative_path(path) + + flags &= 0xffffffff + mode &= 0xffffffff + + idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) + + if idx == -1: + regreturn = -ENOMEM + else: + try: + if ql.archtype== QL_ARCH.ARM: + mode = 0 + + flags = ql_open_flag_mapping(ql, flags) + ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(path, flags, mode) + regreturn = idx + except QlSyscallError as e: + regreturn = -e.errno + + ql.log.debug("creat(%s, 0o%o) = %d" % (relative_path, mode, regreturn)) + + if regreturn >= 0 and regreturn != 2: + ql.log.debug(f'File found: {real_path:s}') + else: + ql.log.debug(f'File not found {real_path:s}') + + return regreturn + +def ql_syscall_openat(ql: Qiling, fd: int, path: int, flags: int, mode: int): + file_path = ql.os.utils.read_cstring(path) + # real_path = ql.os.path.transform_to_real_path(path) + # relative_path = ql.os.path.transform_to_relative_path(path) + + flags &= 0xffffffff + mode &= 0xffffffff + + idx = next((i for i in range(NR_OPEN) if ql.os.fd[i] == 0), -1) + + if idx == -1: + regreturn = -EMFILE + else: + try: + if ql.archtype== QL_ARCH.ARM: + mode = 0 + + flags = ql_open_flag_mapping(ql, flags) + fd = ql.unpacks(ql.pack(fd)) + + if 0 <= fd < NR_OPEN: + dir_fd = ql.os.fd[fd].fileno() + else: + dir_fd = None + + ql.os.fd[idx] = ql.os.fs_mapper.open_ql_file(file_path, flags, mode, dir_fd) + + regreturn = idx + except QlSyscallError as e: + regreturn = -e.errno + + ql.log.debug(f'openat(fd = {fd:d}, path = {file_path}, mode = {mode:#o}) = {regreturn:d}') + + return regreturn + + +def ql_syscall_fcntl(ql: Qiling, fd: int, cmd: int, arg: int): + if not (0 <= fd < NR_OPEN) or ql.os.fd[fd] == 0: + return -EBADF + + f = ql.os.fd[fd] + + if cmd == F_DUPFD: + if 0 <= arg < NR_OPEN: + for idx, val in enumerate(ql.os.fd): + if val == 0 and idx >= arg: + new_fd = ql.os.fd[fd].dup() + ql.os.fd[idx] = new_fd + regreturn = idx + break + else: + regreturn = -EMFILE + else: + regreturn = -EINVAL + + elif cmd == F_GETFD: + regreturn = getattr(f, "close_on_exec", 0) + + elif cmd == F_SETFD: + f.close_on_exec = 1 if arg & FD_CLOEXEC else 0 + regreturn = 0 + + elif cmd == F_GETFL: + regreturn = ql.os.fd[fd].fcntl(cmd, arg) + + elif cmd == F_SETFL: + ql.os.fd[fd].fcntl(cmd, arg) + regreturn = 0 + + else: + regreturn = -1 + + return regreturn + + +def ql_syscall_fcntl64(ql: Qiling, fd: int, cmd: int, arg: int): + + # https://linux.die.net/man/2/fcntl64 + if cmd == F_DUPFD: + if 0 <= arg < NR_OPEN and 0 <= fd < NR_OPEN: + if ql.os.fd[fd] != 0: + new_fd = ql.os.fd[fd].dup() + for idx, val in enumerate(ql.os.fd): + if val == 0 and idx >= arg: + ql.os.fd[idx] = new_fd + regreturn = idx + break + else: + regreturn = -1 + else: + regreturn = -1 + + elif cmd == F_GETFL: + regreturn = 2 + + elif cmd == F_SETFL: + if isinstance(ql.os.fd[fd], ql_socket): + ql.os.fd[fd].fcntl(cmd, arg) + regreturn = 0 + + elif cmd == F_GETFD: + regreturn = 2 + + elif cmd == F_SETFD: + regreturn = 0 + + else: + regreturn = 0 + + return regreturn + + +def ql_syscall_flock(ql: Qiling, fd: int, operation: int): + # Should always return 0, we don't need a actual file lock + + return 0 + + +def ql_syscall_rename(ql: Qiling, oldname_buf: int, newname_buf: int): + """ + rename(const char *oldpath, const char *newpath) + description: change the name or location of a file + ret value: On success, zero is returned. On error, -1 is returned + """ + regreturn = 0 # default value is success + oldpath = ql.os.utils.read_cstring(oldname_buf) + newpath = ql.os.utils.read_cstring(newname_buf) + + ql.log.debug(f"rename() path: {oldpath} -> {newpath}") + + old_realpath = ql.os.path.transform_to_real_path(oldpath) + new_realpath = ql.os.path.transform_to_real_path(newpath) + + if old_realpath == new_realpath: + # do nothing, just return success + return regreturn + + try: + os.rename(old_realpath, new_realpath) + except OSError: + ql.log.exception(f"rename(): {newpath} exists!") + regreturn = -1 + + return regreturn \ No newline at end of file From 58275c03d0e5109c34d3f0753298562031cdacbc Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 11:52:13 +0800 Subject: [PATCH 03/10] adding more test for ci --- examples/rootfs | 2 +- tests/test_httpd.py | 13 +++++++------ tests/www/flag.txt | 1 - tests/www/index.html | 9 --------- 4 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 tests/www/flag.txt delete mode 100644 tests/www/index.html diff --git a/examples/rootfs b/examples/rootfs index 29430e9a..30d44feb 160000 --- a/examples/rootfs +++ b/examples/rootfs @@ -1 +1 @@ -Subproject commit 29430e9a29d2e034a3a664d3479fe699ed374ee3 +Subproject commit 30d44feb3a1f4d4c9eece01b20e97b96aa1db295 diff --git a/tests/test_httpd.py b/tests/test_httpd.py index 098ecb46..86a33c2e 100644 --- a/tests/test_httpd.py +++ b/tests/test_httpd.py @@ -1,19 +1,20 @@ -import os, socket, threading, requests +import sys, os, socket, threading, requests sys.path.append("..") from qiling import Qiling from qiling.const import QL_VERBOSE def test_http_elf_linux_arm(): - ql = Qiling(["../examples/rootfs/arm_linux/bin/vshttpd","-p","20011","-r","../www"], "../examples/rootfs/arm_linux", multithread=True) + ql = Qiling(["../examples/rootfs/arm_linux/bin/vshttpd","-p","20011","-r","www"], "../examples/rootfs/arm_linux", multithread=True, verbose=QL_VERBOSE.DEBUG) ql.run() if __name__ == "__main__": - test_http_elf_linux_arm_therad = threading.Thread(target=test_http_elf_linux_arm, daemon=True) - test_http_elf_linux_arm_therad.start() + # test_http_elf_linux_arm_therad = threading.Thread(target=test_http_elf_linux_arm, daemon=True) + # test_http_elf_linux_arm_therad.start() - r = requests.get('https://localhost:20011/') - print(r.text)[:200] \ No newline at end of file + # r = requests.get('https://localhost:20011/') + # print(r.text)[:200] + test_http_elf_linux_arm() \ No newline at end of file diff --git a/tests/www/flag.txt b/tests/www/flag.txt deleted file mode 100644 index 411473a4..00000000 --- a/tests/www/flag.txt +++ /dev/null @@ -1 +0,0 @@ -test_done diff --git a/tests/www/index.html b/tests/www/index.html deleted file mode 100644 index c8136050..00000000 --- a/tests/www/index.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - This is the title of the webpage! - - - click - - From 6994cbbcc9cb815181e3dc2294d5b47a9b0a2295 Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 12:13:55 +0800 Subject: [PATCH 04/10] get ready for http test --- examples/rootfs | 2 +- examples/src/linux/picohttpd/Makefile | 14 ++ examples/src/linux/picohttpd/httpd.c | 191 ++++++++++++++++++++++++++ examples/src/linux/picohttpd/httpd.h | 37 +++++ examples/src/linux/picohttpd/main.c | 27 ++++ examples/src/linux/picohttpd/server | Bin 0 -> 18800 bytes examples/src/linux/vshttpd.c | 187 ------------------------- tests/test_elf_multithread.py | 2 +- tests/test_httpd.py | 20 --- 9 files changed, 271 insertions(+), 209 deletions(-) create mode 100644 examples/src/linux/picohttpd/Makefile create mode 100644 examples/src/linux/picohttpd/httpd.c create mode 100644 examples/src/linux/picohttpd/httpd.h create mode 100644 examples/src/linux/picohttpd/main.c create mode 100755 examples/src/linux/picohttpd/server delete mode 100644 examples/src/linux/vshttpd.c delete mode 100644 tests/test_httpd.py diff --git a/examples/rootfs b/examples/rootfs index 30d44feb..7a610d66 160000 --- a/examples/rootfs +++ b/examples/rootfs @@ -1 +1 @@ -Subproject commit 30d44feb3a1f4d4c9eece01b20e97b96aa1db295 +Subproject commit 7a610d66184be24e4b301c7552565d3229671ca8 diff --git a/examples/src/linux/picohttpd/Makefile b/examples/src/linux/picohttpd/Makefile new file mode 100644 index 00000000..0e2779b1 --- /dev/null +++ b/examples/src/linux/picohttpd/Makefile @@ -0,0 +1,14 @@ +all: server + +clean: + @rm -rf *.o + @rm -rf server + +server: main.o httpd.o + gcc -o server $^ + +main.o: main.c httpd.h + gcc -c -o main.o main.c + +httpd.o: httpd.c httpd.h + gcc -c -o httpd.o httpd.c diff --git a/examples/src/linux/picohttpd/httpd.c b/examples/src/linux/picohttpd/httpd.c new file mode 100644 index 00000000..746d6ea7 --- /dev/null +++ b/examples/src/linux/picohttpd/httpd.c @@ -0,0 +1,191 @@ +#include "httpd.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CONNMAX 1000 + +static int listenfd, clients[CONNMAX]; +static void error(char *); +static void startServer(const char *); +static void respond(int); + +typedef struct { char *name, *value; } header_t; +static header_t reqhdr[17] = { {"\0", "\0"} }; +static int clientfd; + +static char *buf; + +void serve_forever(const char *PORT) +{ + struct sockaddr_in clientaddr; + socklen_t addrlen; + char c; + + int slot=0; + + printf( + "Server started %shttp://127.0.0.1:%s%s\n", + "\033[92m",PORT,"\033[0m" + ); + + // Setting all elements to -1: signifies there is no client connected + int i; + for (i=0; iai_next) + { + int option = 1; + listenfd = socket (p->ai_family, p->ai_socktype, 0); + setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option)); + if (listenfd == -1) continue; + if (bind(listenfd, p->ai_addr, p->ai_addrlen) == 0) break; + } + if (p==NULL) + { + perror ("socket() or bind()"); + exit(1); + } + + freeaddrinfo(res); + + // listen for incoming connections + if ( listen (listenfd, 1000000) != 0 ) + { + perror("listen() error"); + exit(1); + } +} + + +// get request header +char *request_header(const char* name) +{ + header_t *h = reqhdr; + while(h->name) { + if (strcmp(h->name, name) == 0) return h->value; + h++; + } + return NULL; +} + +//client connection +void respond(int n) +{ + int rcvd, fd, bytes_read; + char *ptr; + + buf = malloc(65535); + rcvd=recv(clients[n], buf, 65535, 0); + + if (rcvd<0) // receive error + fprintf(stderr,("recv() error\n")); + else if (rcvd==0) // receive socket closed + fprintf(stderr,"Client disconnected upexpectedly.\n"); + else // message received + { + buf[rcvd] = '\0'; + + method = strtok(buf, " \t\r\n"); + uri = strtok(NULL, " \t"); + prot = strtok(NULL, " \t\r\n"); + + fprintf(stderr, "\x1b[32m + [%s] %s\x1b[0m\n", method, uri); + + if (qs = strchr(uri, '?')) + { + *qs++ = '\0'; //split URI + } else { + qs = uri - 1; //use an empty string + } + + header_t *h = reqhdr; + char *t, *t2; + while(h < reqhdr+16) { + char *k,*v,*t; + k = strtok(NULL, "\r\n: \t"); if (!k) break; + v = strtok(NULL, "\r\n"); while(*v && *v==' ') v++; + h->name = k; + h->value = v; + h++; + fprintf(stderr, "[H] %s: %s\n", k, v); + t = v + 1 + strlen(v); + if (t[1] == '\r' && t[2] == '\n') break; + } + t++; // now the *t shall be the beginning of user payload + t2 = request_header("Content-Length"); // and the related header if there is + payload = t; + payload_size = t2 ? atol(t2) : (rcvd-(t-buf)); + + // bind clientfd to stdout, making it easier to write + clientfd = clients[n]; + dup2(clientfd, STDOUT_FILENO); + close(clientfd); + + // call router + route(); + + // tidy up + fflush(stdout); + shutdown(STDOUT_FILENO, SHUT_WR); + close(STDOUT_FILENO); + } + + //Closing SOCKET + shutdown(clientfd, SHUT_RDWR); //All further send and recieve operations are DISABLED... + close(clientfd); + clients[n]=-1; +} diff --git a/examples/src/linux/picohttpd/httpd.h b/examples/src/linux/picohttpd/httpd.h new file mode 100644 index 00000000..a0969a17 --- /dev/null +++ b/examples/src/linux/picohttpd/httpd.h @@ -0,0 +1,37 @@ +#ifndef _HTTPD_H___ +#define _HTTPD_H___ + +#include +#include + +//Server control functions + +void serve_forever(const char *PORT); + +// Client request + +char *method, // "GET" or "POST" + *uri, // "/index.html" things before '?' + *qs, // "a=1&b=2" things after '?' + *prot; // "HTTP/1.1" + +char *payload; // for POST +int payload_size; + +char *request_header(const char* name); + +// user shall implement this function + +void route(); + +// some interesting macro for `route()` +#define ROUTE_START() if (0) { +#define ROUTE(METHOD,URI) } else if (strcmp(URI,uri)==0&&strcmp(METHOD,method)==0) { +#define ROUTE_GET(URI) ROUTE("GET", URI) +#define ROUTE_POST(URI) ROUTE("POST", URI) +#define ROUTE_END() } else printf(\ + "HTTP/1.1 500 Not Handled\r\n\r\n" \ + "The server has no handler to the request.\r\n" \ + ); + +#endif diff --git a/examples/src/linux/picohttpd/main.c b/examples/src/linux/picohttpd/main.c new file mode 100644 index 00000000..eca4f8d5 --- /dev/null +++ b/examples/src/linux/picohttpd/main.c @@ -0,0 +1,27 @@ +#include "httpd.h" + +int main(int c, char** v) +{ + serve_forever("12913"); + return 0; +} + +void route() +{ + ROUTE_START() + + ROUTE_GET("/") + { + printf("HTTP/1.1 200 OK\r\n\r\n"); + printf("Hello! You are using %s", request_header("User-Agent")); + } + + ROUTE_POST("/") + { + printf("HTTP/1.1 200 OK\r\n\r\n"); + printf("Wow, seems that you POSTed %d bytes. \r\n", payload_size); + printf("Fetch the data using `payload` variable."); + } + + ROUTE_END() +} diff --git a/examples/src/linux/picohttpd/server b/examples/src/linux/picohttpd/server new file mode 100755 index 0000000000000000000000000000000000000000..40c618e1a24d5ce2d5262f9280de9212b851684f GIT binary patch literal 18800 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

3Oax{?y0&=DrP-gXm=rc zFr20XfE}r%^H88&n~pO&5X+fCyTmw)=)m})NjoMU&xhM^_7Gjo{OQhiJ+cK9eZ^^; z%;D^!mg->sL{iuMTN4>SDvVy%J1x+bObo}iV^IMGSFK;5N47Gqj`suFm_OQ?KoJJj zQ-%bCoQ@?EHYN;NN{dIxK;$~&I`i|np zVb0_XA4a4!EMy)(XXDIFEK82(TWY#3tGl}7iKb!q6Sl1~@da1#h-&pQ!X+1b=`EuVwQpKii{7(cc zbTb&d!jP2p?-k`sS}T<0zO1wU5y)vzR@%#b6iMm+ixSn5`dQkG<(kESk&3jJ`z?~n zeP5{XL_Vx(I~dwimG*L9Mp9KM%lb<_N$-Z7_Gl$9_irSX?RVB+)}b328WU+R_jx2$ zM1^Jf&h|en>{khgaz9AYUg4PRsn4ADj{>72q<`G(8c9&+4u^C8e8*w02s=snJ1D{> z5r=#Bn8RM~LrE(2r3=YRy3b*6-Ykln#y-b@OFK!Qb=b?_1(H_F4SP`mX(#Jr>|2cW zpM1_CseJw+^_~6qvM67UKU0LJpzk{BFUL=4v7aMDD$-u=r%4)@ih?@J|Fy$j?z>4! zzvr#VS^j$v(jJz$OwD}``Ts$j`jVIQG;C>WNZQMNy!=%Fk))o%jqwsc3jxhtX)pI* z%>VZy>QC1nC21$e@t=T^inN#ef`j5sImM;@($6Hwt@bPcXOwCMao8&cY<^FJoP5dh z13^PnTW8RKtf;V11eIhu?5PM*oP?RQzrsX}4Czv`QaN`FiSgYm%5M|Twdjm7tu?aU qGXB!#A?t2f8sA5+G3d`66Hb;Zb*CdUp8Yoih6epV6>D;^?7so7Ry&6P literal 0 HcmV?d00001 diff --git a/examples/src/linux/vshttpd.c b/examples/src/linux/vshttpd.c deleted file mode 100644 index 56a7ad3e..00000000 --- a/examples/src/linux/vshttpd.c +++ /dev/null @@ -1,187 +0,0 @@ -/* -AUTHOR: Abhijeet Rastogi (http://www.google.com/profiles/abhijeet.1989) - -This is a very simple HTTP server. Default port is 10000 and ROOT for the server is your current working directory.. - -You can provide command line arguments like:- $./a.aout -p [port] -r [path] - -for ex. -$./a.out -p 50000 -r /home/ -to start a server at port 50000 with root directory as "/home" - -$./a.out -r /home/shadyabhi -starts the server at port 10000 with ROOT as /home/shadyabhi - -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CONNMAX 1000 -#define BYTES 1024 - -char *ROOT; -int listenfd, clients[CONNMAX]; -void error(char *); -void startServer(char *); -void respond(int); - -int main(int argc, char* argv[]) -{ - struct sockaddr_in clientaddr; - socklen_t addrlen; - char c; - - //Default Values PATH = ~/ and PORT=10000 - char PORT[6]; - ROOT = getenv("PWD"); - strcpy(PORT,"10000"); - - int slot=0; - - //Parsing the command line arguments - while ((c = getopt (argc, argv, "p:r:")) != -1) - switch (c) - { - case 'r': - ROOT = malloc(strlen(optarg)); - strcpy(ROOT,optarg); - break; - case 'p': - strcpy(PORT,optarg); - break; - case '?': - fprintf(stderr,"Wrong arguments given!!!\n"); - exit(1); - default: - exit(1); - } - - printf("Server started at port no. %s%s%s with root directory as %s%s%s\n","\033[92m",PORT,"\033[0m","\033[92m",ROOT,"\033[0m"); - // Setting all elements to -1: signifies there is no client connected - int i; - for (i=0; iai_next) - { - listenfd = socket (p->ai_family, p->ai_socktype, 0); - if (listenfd == -1) continue; - if (bind(listenfd, p->ai_addr, p->ai_addrlen) == 0) break; - } - if (p==NULL) - { - perror ("socket() or bind()"); - exit(1); - } - - freeaddrinfo(res); - - // listen for incoming connections - if ( listen (listenfd, 1000000) != 0 ) - { - perror("listen() error"); - exit(1); - } -} - -//client connection -void respond(int n) -{ - char mesg[99999], *reqline[3], data_to_send[BYTES], path[99999]; - int rcvd, fd, bytes_read; - - memset( (void*)mesg, (int)'\0', 99999 ); - - rcvd=recv(clients[n], mesg, 99999, 0); - - if (rcvd<0) // receive error - fprintf(stderr,("recv() error\n")); - else if (rcvd==0) // receive socket closed - fprintf(stderr,"Client disconnected upexpectedly.\n"); - else // message received - { - printf("%s", mesg); - reqline[0] = strtok (mesg, " \t\n"); - if ( strncmp(reqline[0], "GET\0", 4)==0 ) - { - reqline[1] = strtok (NULL, " \t"); - reqline[2] = strtok (NULL, " \t\n"); - if ( strncmp( reqline[2], "HTTP/1.0", 8)!=0 && strncmp( reqline[2], "HTTP/1.1", 8)!=0 ) - { - write(clients[n], "HTTP/1.0 400 Bad Request\n", 25); - } - else - { - if ( strncmp(reqline[1], "/\0", 2)==0 ) - reqline[1] = "/index.html"; //Because if no file is specified, index.html will be opened by default (like it happens in APACHE... - - strcpy(path, ROOT); - strcpy(&path[strlen(ROOT)], reqline[1]); - printf("file: %s\n", path); - - if ( (fd=open(path, O_RDONLY))!=-1 ) //FILE FOUND - { - send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); - while ( (bytes_read=read(fd, data_to_send, BYTES))>0 ) - write (clients[n], data_to_send, bytes_read); - } - else write(clients[n], "HTTP/1.0 404 Not Found\n", 23); //FILE NOT FOUND - } - } - } - - //Closing SOCKET - shutdown (clients[n], SHUT_RDWR); //All further send and recieve operations are DISABLED... - close(clients[n]); - clients[n]=-1; -} diff --git a/tests/test_elf_multithread.py b/tests/test_elf_multithread.py index a1d38310..e28066e0 100644 --- a/tests/test_elf_multithread.py +++ b/tests/test_elf_multithread.py @@ -3,7 +3,7 @@ # Cross Platform and Multi Architecture Advanced Binary Emulation Framework # -import platform, sys, unittest, os, threading +import platform, sys, unittest, os from unicorn import UcError, UC_ERR_READ_UNMAPPED, UC_ERR_FETCH_UNMAPPED diff --git a/tests/test_httpd.py b/tests/test_httpd.py deleted file mode 100644 index 86a33c2e..00000000 --- a/tests/test_httpd.py +++ /dev/null @@ -1,20 +0,0 @@ - -import sys, os, socket, threading, requests - -sys.path.append("..") -from qiling import Qiling -from qiling.const import QL_VERBOSE - -def test_http_elf_linux_arm(): - ql = Qiling(["../examples/rootfs/arm_linux/bin/vshttpd","-p","20011","-r","www"], "../examples/rootfs/arm_linux", multithread=True, verbose=QL_VERBOSE.DEBUG) - ql.run() - - -if __name__ == "__main__": - # test_http_elf_linux_arm_therad = threading.Thread(target=test_http_elf_linux_arm, daemon=True) - # test_http_elf_linux_arm_therad.start() - - - # r = requests.get('https://localhost:20011/') - # print(r.text)[:200] - test_http_elf_linux_arm() \ No newline at end of file From 61ec606ffb64fdf89b8cc396758e2108c1a9e9e1 Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 12:14:21 +0800 Subject: [PATCH 05/10] get ready for http test, fix bin --- examples/src/linux/picohttpd/server | Bin 18800 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 examples/src/linux/picohttpd/server diff --git a/examples/src/linux/picohttpd/server b/examples/src/linux/picohttpd/server deleted file mode 100755 index 40c618e1a24d5ce2d5262f9280de9212b851684f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18800 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

3Oax{?y0&=DrP-gXm=rc zFr20XfE}r%^H88&n~pO&5X+fCyTmw)=)m})NjoMU&xhM^_7Gjo{OQhiJ+cK9eZ^^; z%;D^!mg->sL{iuMTN4>SDvVy%J1x+bObo}iV^IMGSFK;5N47Gqj`suFm_OQ?KoJJj zQ-%bCoQ@?EHYN;NN{dIxK;$~&I`i|np zVb0_XA4a4!EMy)(XXDIFEK82(TWY#3tGl}7iKb!q6Sl1~@da1#h-&pQ!X+1b=`EuVwQpKii{7(cc zbTb&d!jP2p?-k`sS}T<0zO1wU5y)vzR@%#b6iMm+ixSn5`dQkG<(kESk&3jJ`z?~n zeP5{XL_Vx(I~dwimG*L9Mp9KM%lb<_N$-Z7_Gl$9_irSX?RVB+)}b328WU+R_jx2$ zM1^Jf&h|en>{khgaz9AYUg4PRsn4ADj{>72q<`G(8c9&+4u^C8e8*w02s=snJ1D{> z5r=#Bn8RM~LrE(2r3=YRy3b*6-Ykln#y-b@OFK!Qb=b?_1(H_F4SP`mX(#Jr>|2cW zpM1_CseJw+^_~6qvM67UKU0LJpzk{BFUL=4v7aMDD$-u=r%4)@ih?@J|Fy$j?z>4! zzvr#VS^j$v(jJz$OwD}``Ts$j`jVIQG;C>WNZQMNy!=%Fk))o%jqwsc3jxhtX)pI* z%>VZy>QC1nC21$e@t=T^inN#ef`j5sImM;@($6Hwt@bPcXOwCMao8&cY<^FJoP5dh z13^PnTW8RKtf;V11eIhu?5PM*oP?RQzrsX}4Czv`QaN`FiSgYm%5M|Twdjm7tu?aU qGXB!#A?t2f8sA5+G3d`66Hb;Zb*CdUp8Yoih6epV6>D;^?7so7Ry&6P From 9f4e61fefc0b52af9845acc1e5ff4db7accad009 Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 12:17:15 +0800 Subject: [PATCH 06/10] add pico httpd credits --- examples/src/linux/picohttpd/readme.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 examples/src/linux/picohttpd/readme.txt diff --git a/examples/src/linux/picohttpd/readme.txt b/examples/src/linux/picohttpd/readme.txt new file mode 100644 index 00000000..32ad9edb --- /dev/null +++ b/examples/src/linux/picohttpd/readme.txt @@ -0,0 +1 @@ +copy from: https://gist.github.com/laobubu/d6d0e9beb934b60b2e552c2d03e1409e From cd3fe7677872ee080f7dd0ad5ac8520d873da2ca Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 13:43:53 +0800 Subject: [PATCH 07/10] update make file for arm --- examples/src/linux/picohttpd/Makefile | 14 +++++++++++++- examples/src/linux/picohttpd/main.c | 2 +- examples/src/linux/picohttpd/server | Bin 0 -> 18800 bytes qiling/os/posix/syscall/socket.py | 5 +++-- 4 files changed, 17 insertions(+), 4 deletions(-) create mode 100755 examples/src/linux/picohttpd/server diff --git a/examples/src/linux/picohttpd/Makefile b/examples/src/linux/picohttpd/Makefile index 0e2779b1..b83222f4 100644 --- a/examples/src/linux/picohttpd/Makefile +++ b/examples/src/linux/picohttpd/Makefile @@ -1,14 +1,26 @@ -all: server +all: server arm_server clean: @rm -rf *.o @rm -rf server + @rm -rf arm_server server: main.o httpd.o gcc -o server $^ + @rm -rf *.o main.o: main.c httpd.h gcc -c -o main.o main.c httpd.o: httpd.c httpd.h gcc -c -o httpd.o httpd.c + +arm_server: arm_main.o arm_httpd.o + arm-linux-gnueabi-gcc-10 -o arm_server $^ + @rm -rf *.o + +arm_main.o: main.c httpd.h + arm-linux-gnueabi-gcc-10 -c -o arm_main.o main.c + +arm_httpd.o: httpd.c httpd.h + arm-linux-gnueabi-gcc-10 -c -o arm_httpd.o httpd.c \ No newline at end of file diff --git a/examples/src/linux/picohttpd/main.c b/examples/src/linux/picohttpd/main.c index eca4f8d5..86bc9d95 100644 --- a/examples/src/linux/picohttpd/main.c +++ b/examples/src/linux/picohttpd/main.c @@ -13,7 +13,7 @@ void route() ROUTE_GET("/") { printf("HTTP/1.1 200 OK\r\n\r\n"); - printf("Hello! You are using %s", request_header("User-Agent")); + printf("httpd_test_successful"); } ROUTE_POST("/") diff --git a/examples/src/linux/picohttpd/server b/examples/src/linux/picohttpd/server new file mode 100755 index 0000000000000000000000000000000000000000..452dc88fb60e63e5666003dfdc19062cd10b1855 GIT binary patch literal 18800 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 Date: Fri, 26 Nov 2021 13:44:22 +0800 Subject: [PATCH 08/10] update make file for arm --- examples/src/linux/picohttpd/server | Bin 18800 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 examples/src/linux/picohttpd/server diff --git a/examples/src/linux/picohttpd/server b/examples/src/linux/picohttpd/server deleted file mode 100755 index 452dc88fb60e63e5666003dfdc19062cd10b1855..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18800 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 Date: Fri, 26 Nov 2021 14:12:15 +0800 Subject: [PATCH 09/10] add httpd test --- tests/test_elf_multithread.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/test_elf_multithread.py b/tests/test_elf_multithread.py index e28066e0..a421e803 100644 --- a/tests/test_elf_multithread.py +++ b/tests/test_elf_multithread.py @@ -3,7 +3,7 @@ # Cross Platform and Multi Architecture Advanced Binary Emulation Framework # -import platform, sys, unittest, os +import platform, sys, unittest, os, threading, time from unicorn import UcError, UC_ERR_READ_UNMAPPED, UC_ERR_FETCH_UNMAPPED @@ -281,11 +281,25 @@ class ELFTest(unittest.TestCase): self.assertEqual("server sendto() 14 return 14.\n", ql.buf_out) del ql - - + def test_http_elf_linux_x8664(self): + def picohttpd(): + ql = Qiling(["../examples/rootfs/x8664_linux/bin/picohttpd"], "../examples/rootfs/x8664_linux", multithread=True, verbose=QL_VERBOSE.DEBUG) + ql.run() + picohttpd_therad = threading.Thread(target=picohttpd, daemon=True) + picohttpd_therad.start() + + time.sleep(1) + + f = os.popen("curl http://127.0.0.1:12913") + self.assertEqual("httpd_test_successful", f.read()) + + +if __name__ == "__main__": + unittest.main() + From d3415572b4a088fc221a69aaf11541ea07b28188 Mon Sep 17 00:00:00 2001 From: xwings Date: Fri, 26 Nov 2021 15:22:27 +0800 Subject: [PATCH 10/10] arm httpd test --- examples/rootfs | 2 +- examples/src/linux/picohttpd/httpd.c | 8 ++++++++ examples/src/linux/picohttpd/httpd.h | 6 +++--- examples/src/linux/picohttpd/main.c | 2 +- tests/test_elf_multithread.py | 14 ++++++++++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/examples/rootfs b/examples/rootfs index 7a610d66..3f6aa4bc 160000 --- a/examples/rootfs +++ b/examples/rootfs @@ -1 +1 @@ -Subproject commit 7a610d66184be24e4b301c7552565d3229671ca8 +Subproject commit 3f6aa4bc9dd77839998af6837e4faf6dadf66fe0 diff --git a/examples/src/linux/picohttpd/httpd.c b/examples/src/linux/picohttpd/httpd.c index 746d6ea7..0630fd1c 100644 --- a/examples/src/linux/picohttpd/httpd.c +++ b/examples/src/linux/picohttpd/httpd.c @@ -14,6 +14,14 @@ #define CONNMAX 1000 +char *method, // "GET" or "POST" + *uri, // "/index.html" things before '?' + *qs, // "a=1&b=2" things after '?' + *prot; // "HTTP/1.1" + +char *payload; // for POST +int payload_size; + static int listenfd, clients[CONNMAX]; static void error(char *); static void startServer(const char *); diff --git a/examples/src/linux/picohttpd/httpd.h b/examples/src/linux/picohttpd/httpd.h index a0969a17..6cd7f517 100644 --- a/examples/src/linux/picohttpd/httpd.h +++ b/examples/src/linux/picohttpd/httpd.h @@ -10,13 +10,13 @@ void serve_forever(const char *PORT); // Client request -char *method, // "GET" or "POST" +extern char *method, // "GET" or "POST" *uri, // "/index.html" things before '?' *qs, // "a=1&b=2" things after '?' *prot; // "HTTP/1.1" -char *payload; // for POST -int payload_size; +extern char *payload; // for POST +extern int payload_size; char *request_header(const char* name); diff --git a/examples/src/linux/picohttpd/main.c b/examples/src/linux/picohttpd/main.c index 86bc9d95..0a0fb252 100644 --- a/examples/src/linux/picohttpd/main.c +++ b/examples/src/linux/picohttpd/main.c @@ -1,6 +1,6 @@ #include "httpd.h" -int main(int c, char** v) +int main(int c, char** v, int argc, const char **argv) { serve_forever("12913"); return 0; diff --git a/tests/test_elf_multithread.py b/tests/test_elf_multithread.py index a421e803..5b2a4037 100644 --- a/tests/test_elf_multithread.py +++ b/tests/test_elf_multithread.py @@ -296,6 +296,20 @@ class ELFTest(unittest.TestCase): f = os.popen("curl http://127.0.0.1:12913") self.assertEqual("httpd_test_successful", f.read()) + def test_http_elf_linux_arm(self): + def picohttpd(): + ql = Qiling(["../examples/rootfs/arm_linux/bin/picohttpd"], "../examples/rootfs/arm_linux", multithread=True, verbose=QL_VERBOSE.DEBUG) + ql.run() + + + picohttpd_therad = threading.Thread(target=picohttpd, daemon=True) + picohttpd_therad.start() + + time.sleep(1) + + f = os.popen("curl http://127.0.0.1:12913") + self.assertEqual("httpd_test_successful", f.read()) + if __name__ == "__main__": unittest.main()