# Qiling labs
Solution to QilingLabs from [ShielderSec](https://joansivion.github.io/qilinglabs/).
```python
from binascii import unhexlify
from logging import getLogger
from qiling import *
from qiling.const import *
from qiling.os import *
from qiling.os.mapper import *
from rev import *
from pwn import *
#ql.add_fs_mapper("file",my_class())
#ql.hook_address(my_function,address)
#ql.os.set_api('function_name',my_function)
#ql.os.set_syscall("XXX_SYSCALL_XXX",my_function,QL_INTERCEPT.EXIT)
def set_eax_0(ql):
ql.arch.regs.eax=0
def set_eax_1(ql):
ql.arch.regs.eax = 1
def set_edx_1(ql):
ql.mem.write(ql.arch.regs.rdx,b'\x01')
def change_parms(ql):
ql.arch.regs.rsi = 0x696C6951
ql.arch.regs.rcx = 0x614C676E
ql.arch.regs.rax = 0x20202062
def my_lower(ql,*args):
ql.arch.regs.rax = ql.arch.regs.rdi
def my_sleep(ql,*args):
ql.arch.regs.rdi = 0
def my_getrandom(ql, *args):
ql.mem.write(args[0], b'\x01'*32)
class my_urand(QlFsMappedObject):
def read(self,size):
if size==1:
return b'\x00'
return b'\x01'*size
def close(self):
return 0
class my_cmdline(QlFsMappedObject):
def read(self,size):
return b'qilinglab'
def close(self):
return 0
def my_uname(ql,*args):
buf = ql.arch.regs.rdi
ql.mem.write(buf,b'QilingOS')
ql.mem.write(buf+(65*3),b'ChallengeStart')
def challenge1(ql):
ql.mem.map(0x1337//4096*4096,4096)
ql.mem.write(0x1337,p32(1337))
def challenge2(ql):
ql.os.set_syscall('uname',my_uname,QL_INTERCEPT.EXIT)
def challenge3(ql):
ql.os.set_syscall('getrandom',my_getrandom,QL_INTERCEPT.EXIT)
ql.add_fs_mapper('/dev/urandom',my_urand())
def challenge4(ql):
ql.hook_address(set_eax_1,0x000555555554E43)
def challenge5(ql):
ql.os.set_api('rand',set_eax_0,QL_INTERCEPT.EXIT)
def challenge6(ql):
ql.hook_address(set_eax_0,0x000555555554F16)
def challenge7(ql):
ql.os.set_api('sleep',my_sleep,QL_INTERCEPT.ENTER)
def challenge8(ql):
ql.hook_address(set_edx_1,0x000555555554FB1)
def challenge9(ql):
ql.os.set_api('tolower',my_lower,QL_INTERCEPT.EXIT)
def challenge10(ql):
ql.add_fs_mapper('/proc/self/cmdline',my_cmdline())
def challenge11(ql):
ql.hook_address(change_parms,0x000555555555195)
def run_sandbox(path, rootfs, verbose):
ql = Qiling(path, rootfs, verbose=QL_VERBOSE.DEBUG, console=False)
challenge1(ql) # write to memory
challenge2(ql) # hijack syscall on exit
challenge3(ql) # hijack file object and syscall
challenge4(ql) # hooking an address/instruction
challenge5(ql) # hijacking an api on exit
challenge6(ql) # hooking an address/instruction
challenge7(ql) # hijacking an api on entry
challenge8(ql) # hooking an address/instruction
challenge9(ql) # hijacking an api on exit
challenge10(ql) # hijack file object
challenge11(ql) # hooking an address/instruction
ql.run()
def usage():
print("Script.py <arch> <file>")
if __name__ == "__main__":
if len(sys.argv) < 2 or len(sys.argv) > 4:
usage()
else:
arch = sys.argv[1]
file = sys.argv[2]
if arch == "x86":
run_sandbox([file], "../rootfs/x86_linux", QL_VERBOSE.DEBUG)
elif arch == "x64":
run_sandbox([file], "../rootfs/x8664_linux", QL_VERBOSE.DEBUG)
```