在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

qiling框架和AFLplusplus安裝

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 2023-06-17 16:12 ? 次閱讀

背景

Qiling Framework是一個基于Python的二進制分析、模擬和虛擬化框架。它可以用于動態(tài)分析和仿真運行不同操作系統(tǒng)、處理器和體系結(jié)構(gòu)下的二進制文件。除此之外,Qiling框架還提供了易于使用的API和插件系統(tǒng),方便使用者進行二進制分析和漏洞挖掘等工作。其創(chuàng)始人是一名IoT Hacker,創(chuàng)建qiling的初衷便是解決在研究IoT時遇到的種種問題,這也是為什么上一小節(jié)說qiling框架比unicorn框架更加適合IoT研究初學者。

qiling使用基礎(chǔ)

qiling框架和AFLplusplus安裝

sudo apt-getupdate
sudo apt-getinstall -ybuild-essential python3-dev automake cmake git flex bison libglib2.0-dev libpixman-1-dev python3-setuptools cargo libgtk-3-dev
sudo apt-getinstall -ylld-14llvm-14llvm-14-dev clang-14
sudo apt-getinstall -ygcc-$(gcc --version|head -n1|sed 's/..*//'|sed 's/.* //')-plugin-dev libstdc++-$(gcc --version|head -n1|sed 's/..*//'|sed 's/.* //')-dev
pip3 install qiling
git clone https://github.com/AFLplusplus/AFLplusplus
make-C AFLplusplus
cdAFLplusplus/unicorn_mode
./build_unicorn_support.sh

程序仿真

首先我們需要克隆qiling倉庫,倉庫中一些實例腳本可供我們學習。

git clone --recurse-submodules https://github.com/qilingframework/qiling.git

一個簡單的示例:

#include
#include
# gcc test.c -o test
# 注意:編譯程序的主機libc需要與rootfs glibc版本(libc-2.7.so)相對應(yīng),其他架構(gòu)同理
intmain(){
printf("hello world!");
return0;
}

使用qiling編寫一個簡單的仿真腳本。

fromqiling import*
fromqiling.const importQL_VERBOSE
# 導入qiling模塊和qiling.const模塊中的QL_VERBOSE常量

if__name__ == "__main__":
#創(chuàng)建Qiling對象,實例中三個參數(shù)分別為:path(仿真程序路徑)、rootfs(仿真程序文件系統(tǒng)目錄)和verbose(輸出信息參數(shù)),除此外還可以設(shè)置env和log_plain參數(shù)。
ql = Qiling(["./x8664_linux_symlink/test"], "./x8664_linux_symlink",verbose=QL_VERBOSE.DEBUG)
#運行Qiling對象的run()方法,開始執(zhí)行仿真程序
ql.run()

這里的verbose(輸出信息參數(shù))有如下級別及其作用:

477b47ba-0cda-11ee-962d-dac502259ad0.png

4790d562-0cda-11ee-962d-dac502259ad0.png

476b1642-0cda-11ee-962d-dac502259ad0.png

VFS劫持

x86_fetch_urandom程序的作用為打開/dev/urandom文件,生成隨機數(shù)。當qiling仿真x86_fetch_urandom程序時,環(huán)境需要用到仿真文件系統(tǒng),我們就需要用到VFS劫持,這樣就可以模擬修改文件系統(tǒng)。下面的代碼中為仿真虛擬路徑 "/dev/urandom" 會被映射到宿主系統(tǒng)上的現(xiàn)有"/dev/urandom"文件。當模擬程序?qū)⒃L問 /dev/random 時,將改為訪問映射文件。

fromqiling importQiling

if__name__ == "__main__":
ql = Qiling(["x86_linux/bin/x86_fetch_urandom"], "x86_linux")

ql.add_fs_mapper(r'/dev/urandom', r'/dev/urandom')
ql.verbose=0
ql.run()

47bebe8c-0cda-11ee-962d-dac502259ad0.png

如果我們想要控制虛擬文件'/dev/urandom'的交互結(jié)果,可以繼承QlFsMappedObject類,并可自定義read、write、fstat、ioctl、readline等方法。

fromqiling importQiling
fromqiling.os.mapper importQlFsMappedObject

classFakeUrandom(QlFsMappedObject):
defread(self, size: int)-> bytes:
returnb"x01"#可以修改讀取返回結(jié)果

deffstat(self)-> int:
return-1

defclose(self)-> int:
return0

if__name__ == "__main__":
ql = Qiling(["x86_linux/bin/x86_fetch_urandom"], "x86_linux")
ql.add_fs_mapper(r'/dev/urandom', FakeUrandom())
ql.run()

47d14d90-0cda-11ee-962d-dac502259ad0.png

476b1642-0cda-11ee-962d-dac502259ad0.png

函數(shù)hook

下面示例中,我們給str1和str2倆個變量內(nèi)存中分別復制"abcdef"和"ABCDEF"字符串。正常執(zhí)行完畢后會打印出"str1 大于 str2"。我們可以使用qiling框架劫持strcmp實現(xiàn)為hook strcmp函數(shù)的效果,使其執(zhí)行到不同分支的結(jié)果。

#include
#include

//cd ./x8664_linux/
//gcc demo.c -o test

intmain()
{
charstr1[15];
charstr2[15];
intret;

strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);

if(ret < 0)
??{
?????printf("str1 小于 str2");
??}
??else?if(ret > 0)
{
printf("str1 大于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}

以下代碼為hook strcmp函數(shù),并通過修改rax寄存器改變執(zhí)行流程。

fromqiling import*
fromqiling.const import*

# 自定義strcmp hook函數(shù)。當程序執(zhí)行strcmp函數(shù)退出時,會調(diào)用此函數(shù),并且在比較完畢后,將 rax 寄存器的值修改為 0,表示相等。
defhook_strcmp(ql,*args):
# qiling框架的寄存器取值為ql.arch.reg.xxx
rax = ql.arch.regs.rax
print("hook_addr_rax:",hex(rax))
ql.arch.regs.eax = 0# 0:等于; -1:小于 ;1:大于

# 使用 ql.os.set_api 函數(shù)為 strcmp 設(shè)置hook函數(shù),第一個參數(shù)為要hook的函數(shù)名,第二個參數(shù)為自定義hook函數(shù),第三個參數(shù)為hook類型,這里為退出時觸發(fā)hook函數(shù)。
defhook_func(ql):
ql.os.set_api('strcmp',hook_strcmp,QL_INTERCEPT.EXIT) # 也可以使用ql.hook_address()函數(shù)進行hook,使用方法為ql.hook_address(hook_strcmp,0xXXXXXXXX)

if__name__ == "__main__":
ql = Qiling(["./x8664_linux/test"],"./x8664_linux",verbose=QL_VERBOSE.DEBUG)
hook_func(ql)
#ql.debugger = "gdb12345"
ql.run()

47e98ae0-0cda-11ee-962d-dac502259ad0.png

定義hook函數(shù)時hook類型參數(shù)有以下三種:

480bf166-0cda-11ee-962d-dac502259ad0.png

qiling使用實例


476b1642-0cda-11ee-962d-dac502259ad0.png

使用qiling解密CTF賽題

當我們掌握了最基礎(chǔ)的三個用法后,我們可以測試一個簡單的例子來加深對qiling框架的理解。以上一小節(jié)中unicorn解密ctf題目為例,我們先簡單寫一個運行腳本。這里的ql.debugger="gdb12345"為開啟gdbserver服務(wù),我們可以使用ida或者gdb進行調(diào)試。

4828b8a0-0cda-11ee-962d-dac502259ad0.png

簡單運行后發(fā)現(xiàn)程序和上一小節(jié)中unicorn的運行狀況類似。由于這里我設(shè)置了multithead為True,所以這里會比上一小節(jié)中unicorn的解密速度快不少。但是還是在有限時間內(nèi)只輸出4個字符。

484b07e8-0cda-11ee-962d-dac502259ad0.png

當我們將verbose設(shè)置為QL_VERBOSE.DISASM便可觀察模擬執(zhí)行的匯編指令,根據(jù)匯編指令我們明顯看到程序在call 0x400670處進行了遞歸調(diào)用(或使用調(diào)試器調(diào)試查看),導致解密時間非常長。所以我們需要進行代碼優(yōu)化,思路為使用棧空間來保存一個不同輸入?yún)?shù)以及對應(yīng)計算結(jié)果的字典來避免重復計算。

487b222a-0cda-11ee-962d-dac502259ad0.png

這里qiling由于是由unicorn開發(fā)而來,所以很多用法和unicorn相似。

fromqiling import*
fromqiling.const import*
frompwn import*

defhook_start(ql):
arg0 = ql.arch.regs.rdi
r_rsi = ql.arch.regs.rsi
arg1 = u32(ql.mem.read(r_rsi,4))
if(arg0,arg1) indirect:
(ret_rax,ret_ref) = direct[(arg0,arg1)]
ql.arch.regs.rax = ret_rax
ql.mem.write(r_rsi,p32(ret_ref))
ql.arch.regs.rip = 0x400582
else:
ql.arch.stack_push(r_rsi)
ql.arch.stack_push(arg1)
ql.arch.stack_push(arg0)

defhook_end(ql):
arg0 = ql.arch.stack_pop()
arg1 = ql.arch.stack_pop()
r_rsi = ql.arch.stack_pop()
ret_rax = ql.arch.regs.rax
ret_ref = u32(ql.mem.read(r_rsi,4))
direct[(arg0,arg1)] = (ret_rax,ret_ref)

defsolve(ql):
start_address = 0x400670
end_address = 0x4006f1
end_address2 = 0x400709
ql.hook_address(hook_start,start_address)
ql.hook_address(hook_end,end_address)
ql.hook_address(hook_end,end_address2)

if__name__ == '__main__':
path = ["./x8664_linux_symlink/test"]
rootfs = "./x8664_linux_symlink"
direct = {}
ql = Qiling(path, rootfs,verbose=QL_VERBOSE.DEFAULT)
solve(ql)
ql.run()

運行后便會打印出解密結(jié)果。

489af708-0cda-11ee-962d-dac502259ad0.png

除了上一小節(jié)中的ctf題目掌握qiling的使用外,我們還可通過qilinglab來加深對qiling框架的使用。qilingLab是由11個小挑戰(zhàn)組成的二進制程序,用來幫助新手快速熟悉和掌握 Qiling 框架的基本用法。官方提供了aarch64程序的解題方法,我們根據(jù)這個作為參考解密一下x86_64架構(gòu)的練習程序。

x86_64程序下載(https://www.shielder.com/attachments/qilinglab-x86_64)

首先運行程序,給我們提示,challenges會造成程序崩潰,只有當我們解出相應(yīng)challenge后才會顯示信息。

48d36e30-0cda-11ee-962d-dac502259ad0.png

我們可以通過ida逆向以及編寫qiling腳本進行動態(tài)調(diào)試來完成這些challenge。

48f78a5e-0cda-11ee-962d-dac502259ad0.png

最終的解密腳本如下:

fromqiling import*
frompwn import*
fromqiling.const import*
fromqiling.os.mapper importQlFsMappedObject
importos
importstruct

defhook_cpuid(ql, address, size):
ifql.mem.read(address, size) == b'x0FxA2':
regs = ql.arch.regs
regs.ebx = 0x696C6951
regs.ecx = 0x614C676E
regs.edx = 0x20202062
regs.rip += 2

defchallenge11(ql):
begin, end = 0, 0
forinfo inql.mem.map_info:
#print("=====")
#print(info)
#print("=====")
ifinfo[2] == 5and'qilinglab-x86_64'ininfo[3]:
begin, end = info[:2]
#print("begin_addr",begin)
#print("end_addr",end)
ql.hook_code(hook_cpuid, begin=begin, end=end)

classcmdline(QlFsMappedObject):
defread(self, expected_len):
returnb'qilinglab'

defclose(self):
return0

defchallenge10(ql):
ql.add_fs_mapper('/proc/self/cmdline', cmdline())


defhook_tolower(ql):
return0

defchallenge9(ql):
ql.os.set_api('tolower', hook_tolower)

deffind_and_patch(ql, *args, **kw):
MAGIC = 0x3DFCD6EA00000539
magic_addrs = ql.mem.search(p64(MAGIC))
#print("magic_address:",hex(magic_addrs))

formagic_addr inmagic_addrs:
malloc1_addr = magic_addr - 8
malloc1_data = ql.mem.read(malloc1_addr, 24)
string_addr, _ , check_addr = struct.unpack("QQQ",malloc1_data)

ifql.mem.string(string_addr) == "Random data":
ql.mem.write(check_addr, b"x01")
break

defchallenge8(ql):
base_addr = ql.mem.get_lib_base(os.path.split(ql.path)[-1])
#print("base_addr",hex(base_addr))
ql.hook_address(find_and_patch, base_addr+0xFB5)

defhook_sleep(ql):
return0

defchallenge7(ql):
ql.os.set_api('sleep',hook_sleep)

defhook_rax(ql):
ql.arch.regs.rax = 0

defchallenge6(ql):
base_addr = ql.mem.get_lib_base(os.path.split(ql.path)[-1])
#print("base_addr",hex(base_addr))
hook_addr = base_addr + 0xF16
ql.hook_address(hook_rax, hook_addr)

defhook_rand(ql):
ql.arch.regs.rax = 0

defchallenge5(ql):
ql.os.set_api('rand',hook_rand)

defenter_forbidden_loop_hook(ql):
ql.arch.regs.eax = 1

defchallenge4(ql):
base = ql.mem.get_lib_base(os.path.split(ql.path)[-1])
hook_addr = base + 0xE43
print("qiling binary hookaddr:",hex(hook_addr))
ql.hook_address(enter_forbidden_loop_hook, hook_addr)

classFakeUrandom(QlFsMappedObject):
defread(self, size: int)-> bytes:
ifsize == 1:
returnb"x42"
else:
returnb"x41"* size

defclose(self)-> int:
return0

defhook_getrandom(ql, buf, buflen, flags):
ifbuflen == 32:
data = b'x41'* buflen # b'x41' = A
ql.mem.write(buf, data)
ql.os.set_syscall_return(buflen)
else:
ql.os.set_syscall_return(-1)

defchallenge3(ql):
ql.add_fs_mapper(r'/dev/urandom', FakeUrandom())
ql.os.set_syscall("getrandom", hook_getrandom)

defmy_uname_on_exit_hook(ql, *args):
rdi = ql.arch.regs.rdi
print(f"utsname address: {hex(rdi)}") 
ql.mem.write(rdi, b'QilingOSx00')
ql.mem.write(rdi + 65* 3, b'ChallengeStartx00')

defchallenge2(ql):
ql.os.set_api("uname", my_uname_on_exit_hook, QL_INTERCEPT.EXIT)

defchallenge1(ql):
ql.mem.map(0x1000, 0x1000, info='challenge1')
ql.mem.write(0x1337, p16(1337))

if__name__ == '__main__':
path = ["./x8664_linux/qilinglab-x86_64"]
rootfs = "./x8664_linux"
ql = Qiling(path, rootfs,verbose=QL_VERBOSE.OFF)
challenge1(ql)
challenge2(ql)
challenge3(ql)
challenge4(ql)
challenge5(ql)
challenge6(ql)
challenge7(ql)
challenge8(ql)
challenge9(ql)
challenge10(ql)
challenge11(ql)
#ql.debugger = "gdb12345"
ql.run()

運行后,所有的challenge都會顯示SOLVED。

49143f78-0cda-11ee-962d-dac502259ad0.png

476b1642-0cda-11ee-962d-dac502259ad0.png

qiling設(shè)備仿真

qiling提供了路由器仿真案例,該腳本路徑為qiling/example路徑下

#!/usr/bin/env python3
# 1. Download AC15 Firmware from https://down.tenda.com.cn/uploadfile/AC15/US_AC15V1.0BR_V15.03.05.19_multi_TD01.zip
# 2. unzip
# 3. binwalk -e US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin
# 4. locate squashfs-root
# 5. rm -rf webroot && mv webroot_ro webroot
#
# notes: we are using rootfs in this example, so rootfs = squashfs-root
# 
importos, socket, threading
importsys
sys.path.append("../../../")
fromqiling importQiling
# 從qiling.const中導入QL_VERBOSE,指定qiling的日志輸出級別
fromqiling.const importQL_VERBOSE


# 定義patcher函數(shù),用于跳過網(wǎng)卡信息檢測。在前面小節(jié)我們仿真tenda路由器時,路由器httpd程序在初始化網(wǎng)絡(luò)時會檢查網(wǎng)卡名稱是否為br0。這里腳本直接將代碼執(zhí)行前內(nèi)存中的br0字符串替換成了lo,從而跳過檢查。
defpatcher(ql: Qiling):
br0_addr = ql.mem.search("br0".encode() + b'x00')
foraddr inbr0_addr:
ql.mem.write(addr, b'lox00')

# 定義nvram_listener函數(shù),使用該函數(shù)監(jiān)聽Unix套接字,并在收到消息時返回數(shù)據(jù)。
defnvram_listener():
server_address = 'rootfs/var/cfm_socket'
data = ""
try:
os.unlink(server_address)
exceptOSError:
ifos.path.exists(server_address):
raise

sock = socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)
sock.bind(server_address)
sock.listen(1)
whileTrue:
connection, _ = sock.accept()
try:
whileTrue:
data += str(connection.recv(1024))
if"lan.webiplansslen"indata:
connection.send('192.168.170.169'.encode())
else:
break
data = ""
finally:
connection.close()

# 定義myvfork函數(shù),仿真程序在執(zhí)行系統(tǒng)調(diào)用vfork時被調(diào)用,返回值0。
defmyvfork(ql: Qiling):
regreturn = 0
ql.log.info("vfork() = %d"% regreturn)
returnregreturn
# 仿真主函數(shù),生成qiling實例和添加VFS映射。
defmy_sandbox(path, rootfs):
print("path:",path)
print("rootfs",rootfs)
ql = Qiling(path, rootfs, verbose=QL_VERBOSE.DEBUG)
print("ql:",ql)
ql.add_fs_mapper("/dev/urandom","/dev/urandom")
ql.hook_address(patcher, ql.loader.elf_entry)
ql.debugger = False
ifql.debugger == True:
ql.os.set_syscall("vfork", myvfork) # vfork函數(shù)返回0時,debugger可正常調(diào)試。
ql.run()

if__name__ == "__main__":
# 創(chuàng)建后臺運行的線程并執(zhí)行,以便收到Unix套接字的消息時進行響應(yīng)。
nvram_listener_therad = threading.Thread(target=nvram_listener, daemon=True)
nvram_listener_therad.start()
# 運行仿真實例
my_sandbox(["rootfs/bin/httpd"], "rootfs")

當我們運行腳本后,會顯示路由器的ip和端口,當我們發(fā)現(xiàn)本地的8080正在監(jiān)聽時,說明設(shè)備已經(jīng)仿真成功。

4946e194-0cda-11ee-962d-dac502259ad0.png

仿真成功后可訪問http://localhost:8080查看效果:

49677b0c-0cda-11ee-962d-dac502259ad0.png

在后面的小節(jié)中,我們會學習對仿真路由器設(shè)備進行fuzz。其中最為重要的一步便是編寫仿真腳本,后續(xù)在我們分析好固件程序中要fuzz地址范圍后,只有仿真設(shè)備可以順利觸發(fā)保存快照的功能,才可保證fuzz的正確性。

qiling fuzz

qiling框架可以使用AFLplusplus對arm架構(gòu)程序進行fuzz測試,測試代碼如下:

#include
#include
#include
// Program that will crash easily.
#defineSIZE (10)

intfun(inti)
{
char*buf = malloc(SIZE);
charbuf2[SIZE];

while((*buf = getc(stdin)) == 'A')
{
buf[i++] = *buf;
}
strncpy(buf2, buf, i);
puts(buf2);
return0;
}

intmain(intargc, char**argv)
{
returnfun(argc);
}

qiling提供的fuzz腳本如下:

#!/usr/bin/env python3
"""
Simple example of how to use Qiling together with AFLplusplus. 
This is tested with the recent Qiling framework (the one you cloned),
afl++ from https://github.com/AFLplusplus/AFLplusplus

After building afl++, make sure you install `unicorn_mode/setup_unicorn.sh`

Then, run this file using afl++ unicorn mode with
afl-fuzz -i ./afl_inputs -o ./afl_outputs -m none -U -- python3 ./fuzz_x8664_linux.py @@
"""

# No more need for importing unicornafl, try ql.afl_fuzz instead!

importsys, os
frombinascii importhexlify
sys.path.append("../../..")
fromqiling import*
fromqiling.extensions importpipe
fromqiling.extensions.afl importql_afl_fuzz

defmain(input_file, enable_trace=False):
ql = Qiling(["./arm_fuzz"], "../../rootfs/arm_qnx", console=enable_trace)
# 設(shè)置ql的標準輸入為進程的標準輸入
ql.os.stdin = pipe.SimpleInStream(sys.stdin.fileno())
# 如果沒有啟用控制臺追蹤,則將標準輸出和標準錯誤流設(shè)置為Null
ifnotenable_trace:
ql.os.stdout = pipe.NullOutStream(sys.stdout.fileno())
ql.os.stderr = pipe.NullOutStream(sys.stderr.fileno())

defplace_input_callback(ql: Qiling, input: bytes, _: int):
# 設(shè)置fuzz輸入點 
ql.os.stdin.write(input)
returnTrue

defstart_afl(_ql: Qiling):
# 設(shè)置fuzz實例
ql_afl_fuzz(_ql, input_file=input_file, place_input_callback=place_input_callback, exits=[ql.os.exit_point])

# 獲取libc的基地址
LIBC_BASE = int(ql.profile.get("OS32", "interp_address"), 16)
# 設(shè)置hook函數(shù),用于處理SignalKill信號
ql.hook_address(callback=lambdax: os.abort(), address=LIBC_BASE + 0x38170)
# main函數(shù)地址
main_addr = 0x08048aa0
# 設(shè)置hook函數(shù),在main函數(shù)運行時調(diào)用start_afl函數(shù)
ql.hook_address(callback=start_afl, address=main_addr)

# 若啟用控制臺追蹤,則將設(shè)置相關(guān)信息輸出
ifenable_trace:
# The following lines are only for `-t` debug output
md = ql.arch.disassembler
count = [0]
defspaced_hex(data):
returnb' '.join(hexlify(data)[i:i+2] fori inrange(0, len(hexlify(data)), 2)).decode('utf-8')

defdisasm(count, ql, address, size):
buf = ql.mem.read(address, size)
try:
fori inmd.disasm(buf, address):
return"{:08X}	{:08X}: {:24s} {:10s} {:16s}".format(count[0], i.address, spaced_hex(buf), i.mnemonic,
i.op_str)
except:
importtraceback
print(traceback.format_exc())

deftrace_cb(ql, address, size, count):
rtn = '{:100s}'.format(disasm(count, ql, address, size))
print(rtn)
count[0] += 1

ql.hook_code(trace_cb, count)

# okay, ready to roll.
# try:
ql.run()
# except Exception as ex:
# # Probable unicorn memory error. Treat as crash.
# print(ex)
# os.abort()
os._exit(0) # that's a looot faster than tidying up.


if__name__ == "__main__":
iflen(sys.argv) == 1:
raiseValueError("No input file provided.")
iflen(sys.argv) > 2andsys.argv[1] == "-t":
main(sys.argv[2], enable_trace=True)
else:
main(sys.argv[1])

AFLplusplus執(zhí)行腳本如下:

#!/usr/bin/sh
AFL_AUTORESUME=1 AFL_PATH="$(realpath ../../../AFLplusplus)"PATH="$AFL_PATH:$PATH"afl-fuzz -i afl_inputs -o afl_outputs -U -- python3 ./fuzz_arm_qnx.py @@

運行后fuzz.sh后,便會出現(xiàn)afl++ 運行界面,等待幾秒后便出現(xiàn)crash。

498c501c-0cda-11ee-962d-dac502259ad0.png

crash的變異數(shù)據(jù)存放在afl_outputs目錄下,我們可以使用xxd id:000000,xxxxxx命令查看變異數(shù)據(jù)。

#xxdid:000000,sig:06,src:000000,time:4112,execs:1077,op:havoc,rep:8
00000000: 4141 4141 4141 4141 4141 4141 ff7f4241 AAAAAAAAAAAA..BA
00000010: 4141 4145 4141 be414dff0000 0041 4141 AAAEAA.AM....AAA
00000020: 41

責任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17487
  • 虛擬化
    +關(guān)注

    關(guān)注

    1

    文章

    373

    瀏覽量

    29796
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    187

    文章

    4210

    瀏覽量

    196795

原文標題:物聯(lián)網(wǎng)安全之qiling框架初探

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    labview視覺通用平臺框架源代碼

    本帖最后由 1281788316 于 2024-4-19 13:52 編輯 labview通用視覺軟件框架,機器視覺通用框架 通用視覺框架源代碼。可以參考用于開發(fā)常規(guī)案例。里面有部分函數(shù),用戶
    發(fā)表于 08-03 16:57

    [資料分享]+Android框架揭秘

    `[資料分享]+Android框架揭秘一、看威武霸氣的封面作者:(韓)金泰延等 二、讀讀簡介,看看適合你嗎? 《android框架揭秘》通過對android系統(tǒng)源代碼的分析,主要介紹android
    發(fā)表于 09-26 09:47

    Py之TFCudaCudnn:Win10下安裝深度學習框架Tensorflow+Cuda+Cudnn最簡單最快捷最詳細攻略

    Py之TFCudaCudnn:Win10下安裝深度學習框架Tensorflow+Cuda+Cudnn最簡單最快捷最詳細攻略
    發(fā)表于 12-20 10:35

    Yaf框架安裝和HelloWorld

    Yaf框架:從安裝到HelloWorld
    發(fā)表于 06-28 09:29

    什么是框架?為什么要有框架

    前言什么是框架?程序框架其實就類似一個文件大綱或者模板。因為寫程序就和類似于寫文章,如果沒有大綱或者模板那么你寫起來就會比較費勁。而。為什么要有框架?節(jié)約時間,減少錯誤。因為對于一種類型的程序它們
    發(fā)表于 11-09 07:38

    在 ubuntu 上安裝騰訊推理框架 ncnn 的方法記錄

    本教程詳細記錄了在 ubuntu 上安裝騰訊推理框架 ncnn 的方法。
    發(fā)表于 12-14 07:49

    在arduino ide中安裝esp32的arduino框架時的問題求解

    在arduino ide中安裝esp32的arduino框架時的問題在arduino ide中安裝esp32的arduino框架: arduino ide彈出錯誤:
    發(fā)表于 03-06 08:22

    堡盟新型框架適配器——通過兩次卡入安裝傳感器

    堡盟新型框架適配器——通過兩次卡入安裝傳感
    發(fā)表于 01-08 09:34 ?747次閱讀

    SHARC音頻模塊:如何安裝和配置裸機框架以便使用

    詳解介紹如何安裝和配置裸機框架,以獲得成功的使用體驗。
    的頭像 發(fā)表于 06-27 06:07 ?2906次閱讀
    SHARC音頻模塊:如何<b class='flag-5'>安裝</b>和配置裸機<b class='flag-5'>框架</b>以便使用

    電流互感器安裝圖解

    電流互感器一般安裝在成套配電柜、金屬構(gòu)架上,也可安裝在母線穿過墻壁或樓板處。電流互感器可直接用基礎(chǔ)螺栓固定在墻壁或樓板上,或者用角鋼做成矩形框架埋入墻壁或樓板中,將與框架同樣大小的鐵板
    發(fā)表于 06-25 17:32 ?2w次閱讀

    cartography框架安裝與建圖測試

    cartgrapher這個框架是google在2016年開源出來的框架,該框架可以接入2D激光、3D激光、里程計、IMU傳感器的數(shù)據(jù),輸出2D地圖或者是3D地圖。同時該框架還有一個比較
    的頭像 發(fā)表于 08-10 11:43 ?1455次閱讀

    qiling fuzz iot設(shè)備測試及實例分析

    qiling和AFL++環(huán)境的搭建在前面的小節(jié)中已經(jīng)說過,這里就不再演示。
    的頭像 發(fā)表于 07-22 09:05 ?1724次閱讀
    <b class='flag-5'>qiling</b> fuzz iot設(shè)備測試及實例分析

    labview通用視覺框架參考

    labview通用視覺軟件框架,機器視覺通用框架 通用視覺框架源代碼。可以參考用于開發(fā)常規(guī)案例。里面有部分函數(shù),用戶也可隨意編輯函數(shù),開發(fā)速度超級快。打開前需要先安裝labview、V
    發(fā)表于 08-04 15:58 ?82次下載

    基于Python 輕量級ORM框架

    重量級,僅僅為了使用Django的ORM框架的功能,而安裝Django有點導致系統(tǒng)臃腫。而peewee這個框架語法幾乎與Django的ORM框架一致,而又非常輕量。 它的
    的頭像 發(fā)表于 11-01 11:17 ?635次閱讀
    基于Python 輕量級ORM<b class='flag-5'>框架</b>

    搭建ssm框架的詳細流程

    有效地集成和利用這些開源框架,提高開發(fā)效率,并且具有良好的可擴展性和可維護性。 本文將詳細介紹搭建SSM框架的流程,包括環(huán)境搭建、創(chuàng)建項目、配置框架和測試等步驟。 一、環(huán)境搭建 首先,我們需要確保電腦已經(jīng)
    的頭像 發(fā)表于 12-03 14:52 ?3430次閱讀
    主站蜘蛛池模板: 午夜寂寞在线一级观看免费| 操欧洲美女| 欧美一级免费| 国产爽视频| 曰本aaaaa毛片午夜网站| 国产精品高清久久久久久久| 五月天色婷婷丁香| 康熙古代高h细节肉爽文全文| 亚洲视频欧美视频| 日韩精品毛片| 国产三级在线观看免费| 午夜一级福利| 性猛交毛片| 在线免费看黄| 欧洲乱码专区一区二区三区四区| 韩国免费三片在线视频| 天天爽夜夜爽精品免费| 亚洲酒色1314狠狠做| 五月婷婷丁香综合| bt天堂在线www中文在线| 国产午夜剧场| 五月婷婷之婷婷| 国产小毛片| 99精品视频在线播放2| 一级毛片视屏| 精品色| 色综合亚洲天天综合网站| 国产h视频在线| 亚色成人| 国产成人99久久亚洲综合精品| 狼人狠狠干| 调教双性学霸美人| 国产女人在线视频| 成人免费久久精品国产片久久影院 | 亚洲swag精品自拍一区| www.亚洲黄色| 特黄aa级毛片免费视频播放| 日本午夜片| 天天插天天操天天干| 无人码一区二区三区视频| 精品视频一区二区三区四区五区|