Skip to content

Commit 81d643f

Browse files
authored
Merge pull request #1590 from elicn/dev
Periodic maintenance PR
2 parents c2efb24 + c5d7a85 commit 81d643f

File tree

23 files changed

+515
-195
lines changed

23 files changed

+515
-195
lines changed

examples/fuzzing/dlink_dir815/dir815_mips32el_linux.py

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
# Everything about the bug and firmware https://www.exploit-db.com/exploits/33863
77

8-
import os,sys
8+
import sys
99
sys.path.append("../../..")
1010

1111
from qiling import Qiling
1212
from qiling.const import QL_VERBOSE
1313
from qiling.extensions.afl import ql_afl_fuzz
1414

1515

16-
def main(input_file, enable_trace=False):
16+
def main(input_file: str):
1717

1818
env_vars = {
1919
"REQUEST_METHOD": "POST",
@@ -24,40 +24,36 @@ def main(input_file, enable_trace=False):
2424
# "CONTENT_LENGTH": "8", # no needed
2525
}
2626

27-
ql = Qiling(["./rootfs/htdocs/web/hedwig.cgi"], "./rootfs",
28-
verbose=QL_VERBOSE.DEBUG, env=env_vars, console=enable_trace)
27+
ql = Qiling(["./rootfs/htdocs/web/hedwig.cgi"], "./rootfs", verbose=QL_VERBOSE.DISABLED, env=env_vars)
2928

30-
def place_input_callback(ql: Qiling, input: bytes, _: int):
31-
env_var = ("HTTP_COOKIE=uid=1234&password=").encode()
32-
env_vars = env_var + input + b"\x00" + (ql.path).encode() + b"\x00"
33-
ql.mem.write(ql.target_addr, env_vars)
29+
def place_input_callback(ql: Qiling, data: bytes, _: int) -> bool:
30+
# construct the payload
31+
payload = b''.join((b"HTTP_COOKIE=uid=1234&password=", bytes(data), b"\x00", ql_path, b"\x00"))
3432

35-
def start_afl(_ql: Qiling):
33+
# patch the value of 'HTTP_COOKIE' in memory
34+
ql.mem.write(target_addr, payload)
35+
36+
# payload is in place, we are good to go
37+
return True
3638

39+
def start_afl(_ql: Qiling):
3740
"""
3841
Callback from inside
3942
"""
43+
4044
ql_afl_fuzz(_ql, input_file=input_file, place_input_callback=place_input_callback, exits=[ql.os.exit_point])
4145

42-
addr = ql.mem.search("HTTP_COOKIE=uid=1234&password=".encode())
43-
ql.target_addr = addr[0]
46+
addr = ql.mem.search(b"HTTP_COOKIE=uid=1234&password=")
47+
target_addr = addr[0]
48+
ql_path = ql.path.encode()
4449

45-
main_addr = ql.loader.elf_entry
46-
ql.hook_address(callback=start_afl, address=main_addr)
50+
ql.hook_address(start_afl, ql.loader.elf_entry)
4751

48-
try:
49-
ql.run()
50-
os._exit(0)
51-
except:
52-
if enable_trace:
53-
print("\nFuzzer Went Shit")
54-
os._exit(0)
52+
ql.run()
5553

5654

5755
if __name__ == "__main__":
58-
if len(sys.argv) == 1:
56+
if len(sys.argv) < 2:
5957
raise ValueError("No input file provided.")
60-
if len(sys.argv) > 2 and sys.argv[1] == "-t":
61-
main(sys.argv[2], enable_trace=True)
62-
else:
63-
main(sys.argv[1])
58+
59+
main(sys.argv[1])

examples/sality.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def hook_StartServiceA(ql: Qiling, address: int, params):
159159
init_unseen_symbols(ql.amsint32_driver, ntoskrnl.base+0xb7695, b"NtTerminateProcess", 0, "ntoskrnl.exe")
160160
#ql.amsint32_driver.debugger= ":9999"
161161
try:
162-
ql.amsint32_driver.load()
162+
ql.amsint32_driver.run()
163163
return 1
164164
except UcError as e:
165165
print("Load driver error: ", e)

examples/tendaac1518_httpd.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ def __vfork(ql: Qiling):
7878

7979
ql.os.set_syscall('vfork', __vfork)
8080

81+
os.unlink(fr'{ROOTFS}/proc/sys/kernel/core_pattern')
82+
8183
ql.run()
8284

8385

qiling/arch/utils.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def get_base_and_name(self, addr: int) -> Tuple[int, str]:
4848
return addr, '-'
4949

5050
def disassembler(self, ql: Qiling, address: int, size: int):
51-
data = ql.mem.read(address, size)
51+
data = memoryview(ql.mem.read(address, size))
5252

5353
# knowing that all binary sections are aligned to page boundary allows
5454
# us to 'cheat' and search for the containing image using the aligned
@@ -64,11 +64,14 @@ def disassembler(self, ql: Qiling, address: int, size: int):
6464
ba, name = self.get_base_and_name(ql.mem.align(address))
6565

6666
anibbles = ql.arch.bits // 4
67+
pos = 0
6768

68-
for insn in ql.arch.disassembler.disasm(data, address):
69-
offset = insn.address - ba
69+
for iaddr, isize, mnem, ops in ql.arch.disassembler.disasm_lite(data, address):
70+
offset = iaddr - ba
71+
ibytes = data[pos:pos + isize]
7072

71-
ql.log.info(f'{insn.address:0{anibbles}x} [{name:20s} + {offset:#08x}] {insn.bytes.hex(" "):20s} {insn.mnemonic:20s} {insn.op_str}')
73+
ql.log.info(f'{iaddr:0{anibbles}x} [{name:20s} + {offset:#08x}] {ibytes.hex():22s} {mnem:16s} {ops}')
74+
pos += isize
7275

7376
if ql.verbose >= QL_VERBOSE.DUMP:
7477
for reg in ql.arch.regs.register_mapping:

qiling/cc/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ def setReturnValue(self, val: int) -> None:
7070

7171
raise NotImplementedError
7272

73+
def getReturnAddress(self) -> int:
74+
"""Get function return address.
75+
"""
76+
77+
raise NotImplementedError
78+
7379
def setReturnAddress(self, addr: int) -> None:
7480
"""Set function return address.
7581

qiling/cc/arm.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,22 @@ class QlArmBaseCC(QlCommonBaseCC):
2121
def getNumSlots(argbits: int) -> int:
2222
return 1
2323

24+
def getReturnAddress(self) -> int:
25+
return self.arch.regs.lr
26+
2427
def setReturnAddress(self, addr: int) -> None:
2528
self.arch.regs.lr = addr
2629

2730
def unwind(self, nslots: int) -> int:
2831
# TODO: cleanup?
29-
return self.arch.regs.lr
32+
return self.getReturnAddress()
33+
3034

3135
class aarch64(QlArmBaseCC):
3236
_retreg = UC_ARM64_REG_X0
3337
_argregs = make_arg_list(UC_ARM64_REG_X0, UC_ARM64_REG_X1, UC_ARM64_REG_X2, UC_ARM64_REG_X3, UC_ARM64_REG_X4, UC_ARM64_REG_X5, UC_ARM64_REG_X6, UC_ARM64_REG_X7)
3438

39+
3540
class aarch32(QlArmBaseCC):
3641
_retreg = UC_ARM_REG_R0
3742
_argregs = make_arg_list(UC_ARM_REG_R0, UC_ARM_REG_R1, UC_ARM_REG_R2, UC_ARM_REG_R3)

qiling/cc/intel.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class QlIntelBaseCC(QlCommonBaseCC):
1515
Supports arguments passing over registers and stack.
1616
"""
1717

18+
def getReturnAddress(self) -> int:
19+
return self.arch.stack_read(0)
20+
1821
def setReturnAddress(self, addr: int) -> None:
1922
self.arch.stack_push(addr)
2023

qiling/cc/mips.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ class mipso32(QlCommonBaseCC):
1212
_shadow = 4
1313
_retaddr_on_stack = False
1414

15+
def getReturnAddress(self) -> int:
16+
return self.arch.regs.ra
17+
1518
def setReturnAddress(self, addr: int):
1619
self.arch.regs.ra = addr
1720

qiling/cc/ppc.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ class ppc(QlCommonBaseCC):
2222
def getNumSlots(argbits: int):
2323
return 1
2424

25+
def getReturnAddress(self) -> int:
26+
return self.arch.regs.lr
27+
2528
def setReturnAddress(self, addr: int):
2629
self.arch.regs.lr = addr

qiling/cc/riscv.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,8 @@ class riscv(QlCommonBaseCC):
2222
def getNumSlots(argbits: int):
2323
return 1
2424

25+
def getReturnAddress(self) -> int:
26+
return self.arch.regs.ra
27+
2528
def setReturnAddress(self, addr: int):
2629
self.arch.regs.ra = addr

0 commit comments

Comments
 (0)