通过扩展指令增强基于覆盖引导的模糊测试

本文由Bruno Oliveira于2024年4月25日发表于IncludeSec的官方网站上。作为IncludeSec的安全研究人员,在他们日常的安全审计和渗透测试工作中,有时需要为客户开发一些模糊测试工具。在安全评估方法中使用模糊测试技术,可以有效地在复杂的现代化软件产品中发现和识别安全漏洞,并为应用程序快速提供高度结构化的输入数据。

当我们的客户要求在手动和传统自动化测试之外进行更全面的工作,以提供额外的分析来发现更复杂的漏洞时,通常会应用此技术。在这篇文章中,我们将跟大家介绍于模糊测试相关的内容,并详细阐述如何通过扩展指令增强基于覆盖引导的模糊测试。

介绍

基于覆盖引导的模糊测试是很多高级模糊测试工具所使用的一种十分有用的功能,例如AFL、libFuzzer和Fuzzilli等。这种功能允许模糊测试工具确认一个输入是否能够在源程序路径中发现新的边或执行分支。在控制流图(CFG)中,一个边连接两个分支。比如说,如果一个辑条件涉及if-else语句,则会有两条边,一条用于if,另一条用于else语句。它是模糊测试过程中的重要组成部分,有助于确定模糊测试工具是否有效地覆盖了目标程序的可执行代码。

引导模糊测试通常会使用基于覆盖引导的模糊测试(CGF)技术,这种技术会使用非常基本的指令来收集所需数据,以识别在模糊测试用力的执行过程中是否命中了新的边或代码块。

这种指令指的是在程序编译过程中添加的代码,这些代码的功能非常丰富,包括软件调试在内。

本文我们将以JerryScript(包含了一个已知且公开的漏洞)为例,介绍如何使用相关技术来扩展Fuzzili的检测以提升漏洞识别效率,并为模糊测试工具提供更有价值的数据以进行进一步的测试。

模糊测试

模糊测试指的是向目标应用程序提供一系列随机输入以尝试触发应用程序非预期行为的过程。根据最新的模糊测试方法,很多模糊测试工具会考虑目标应用程序的多个方面以生成更合适测试场景的输入数据。其中一个考虑因素就是种子,即生成输入数据的源。某些现代软件的结构比较复杂,我们无法通过简单的输入来获取期望的结果。换言之,也就是无法通过简单的输入对目标应用程序产生足够的影响,这样也就难以发现潜在的安全漏洞。

下图中显示的是带有变异策略和代码覆盖功能的模糊测试程序的通用基本结构:

1、选择种子;

2、变异过程需要获取种子作为初始的执行输入;

3、程序执行;

4、触发漏洞,或者...;

5、输入命中了目标程序中的一个新的边,模糊测试工具继续对种子执行变异操作,或者...;

6、输入没有命中新的边,模糊测试工具选择一个新的种子执行变异;

代码覆盖率可以让模糊测试工具在目标应用程序执行过程中发现新的边或代码块,有助于识别输入是否能够抵达目标应用程序的各个部分。

下图所示为Fuzzilli在对样本进行处理和变异时所使用的算法:

Clang

Clang是一款针对C、C++、Objective-C和Objective-C++编程语言的编译器,该编译器属于LLVM项目的一个部分,可以提供比GCC这种传统编译器更强大的功能。

Clang编译器中很重要的一个工具就是数据清洗器(Sanitizer),Sanitizer可以被视作一种安全库或工具,可以通过检查目标代码来自动检测安全漏洞。启用了Sanitizer之后,编译器会自动检查编译后的代码是否存在安全问题。

常见的Sanitizer包括:

1、AddressSanitizer (ASAN);

2、UndefinedBehaviorSanitizer (UBSAN);

3、MemorySanitizer (MSAN);

4、ThreadSanitizer (TSAN);

5、LeakSanitizer (LSAN);

下面给出的Shell代码段显示了如何使用ASAN选项在代码编译过程中跟踪程序计数器:

$ clang -o targetprogram -g -fsanitize=address -fsanitize-coverage=trace-pc-guard targetprogram.c

根据Clang文档的描述,LLVM内置了一个简单的代码覆盖指令,可以向用户定义的函数插入函数调用,并提供了回调的默认实现,从而实现了简单的覆盖率报告和可视化。

比如说,Fuzzilli(Google的JavaScript引擎模糊测试工具)就使用了简单的指令来响应Fuzzilli的进程,具体如下代码段所示:

extern "C" void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {

    uint32_t index = *guard;

    __shmem->edges[index / 8] |= 1 << (index % 8);

    *guard = 0;

}

当找到一个新的边时,__sanitizer_cov_trace_pc_guard()函数会持续执行,因此无需任何条件来处理新的边被发现时要做什么。接下来,函数会将共享位图中的__shmem->edges设置为1,Fuzzilli会在执行后对位图进行分析。

其他工具,比如说LLVM-COV,能够静态地捕获代码覆盖率信息,在执行之后提供人类可读的文档。但是,需要高效读取磁盘中文档的模糊测试工具,可能会影响性能。

获取更多的信息

我们可以修改Fuzzilli的指令,并观察__sanitizer_cov_trace_pc_guard()能够给代码覆盖率带来什么其他的东西。下列代码段演示了我们对Fuzzilli指令的部分修改:

extern "C" void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {

    uint32_t index = *guard;

 

    void *PC = __builtin_return_address(0);

    char PcDescr[1024];

 

    __sanitizer_symbolize_pc(PC, "%p %F %L", PcDescr, sizeof(PcDescr));

    printf("guard: %p %x PC %s\n", guard, *guard, PcDescr);

 

    __shmem->edges[index / 8] |= 1 << (index % 8);

    *guard = 0;

}

我们已经知道的是,__sanitizer_cov_trace_pc_guard()函数在每次程序命中新的边时便会执行。此时,我们可以利用__builtin_return_address()函数来收集每一个命中的新的边所返回的地址。现在,PC指针已经获取到了返回的地址信息。我们可以利用__sanitizer_symbolize_pc()函数来将地址与符号相关联,从而提供有关执行过程中所使用的源代码文件的更多信息。

大多数模糊测试工具只会使用边的信息来引导模糊测试。然而,正如我们接下来会给大家演示的那样,我们可以使用Sanitizer接口来为安全评估提供更多有价值的信息。

动手实操

在我们的演示过程中,我们将利用一个旧版本的JerryScript JavaScript引擎来创建一个环境,环境信息如下:

1、操作系统(OS):Ubuntu 22.04;

2、目标程序:JerryScript;

3、漏洞:CVE-2023-36109;

环境搭建

我们可以使用下列命令构建JerryScript,首先克隆项目代码库:

$ git clone https://github.com/jerryscript-project/jerryscript.git

切换到JerryScript目录,并校验8ba0d1b6ee5a065a42f3b306771ad8e3c0d819bc commit:

$ git checkout 8ba0d1b6ee5a065a42f3b306771ad8e3c0d819bc

然后应用Fuzziilli库提供的修补程序:

$ cd jerry-main

$ wget https://github.com/googleprojectzero/fuzzilli/raw/main/Targets/Jerryscript/Patches/jerryscript.patch

$ patch < jerryscript.patch

patching file CMakeLists.txt

patching file main-fuzzilli.c

patching file main-fuzzilli.h

patching file main-options.c

patching file main-options.h

patching file main-unix.c

Fuzziilli修补程序提供的指令文件为jerry-main/main-fuzzilli.c,其中也包含了简单的代码覆盖功能,但这还远远不够。因此 ,我们还需要像之前一样在编译代码之前更新__sanitizer_cov_trace_pc_guard()函数。除此之外,还需要将下列Header添加到jerry-main/main-fuzzilli.c文件中:

void __sanitizer_cov_trace_pc_guard(uint32_t *guard) {

    uint32_t index = *guard;

    if(!index) return;

    index--;

 

    void *PC = __builtin_return_address(0);

    char PcDescr[1024];

 

    __sanitizer_symbolize_pc(PC, "%p %F %L", PcDescr, sizeof(PcDescr));

    printf("guard: %p %x PC %s\n", (void *)guard, *guard, PcDescr);

    __shmem->edges[index / 8] |= 1 << (index % 8);

    *guard = 0;

}

我们现在更改编译配置并禁用strip,这些符号仅用于识别我们演示中可能存在的易受攻击功能。修改根目录中的CMakeLists.txt文件:

# Strip binary

if(ENABLE_STRIP AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug")

  jerry_add_link_flags(-g)

endif()

确保jerry-main/CMakeLists.txt包含了main-fuzzilli.c文件之后,我们就可以准备编译代码并使用Fuzzilli指令完成构建了:

$ python jerryscript/tools/build.py --compile-flag=-fsanitize-coverage=trace-pc-guard --profile=es2015-subset --lto=off --compile-flag=-D_POSIX_C_SOURCE=200809 --compile-flag=-Wno-strict-prototypes --stack-limit=15

如果你安装了Clang,但CMAKE_C_COMPILER_ID却显示 GNU或其他内容的话,你可能构建过程出错了:

$ python tools/build.py --compile-flag=-fsanitize-coverage=trace-pc-guard --profile=es2015-subset --lto=off --compile-flag=-D_POSIX_C_SOURCE=200809 --compile-flag=-Wno-strict-prototypes --stack-limit=15

-- CMAKE_BUILD_TYPE               MinSizeRel

-- CMAKE_C_COMPILER_ID            GNU

-- CMAKE_SYSTEM_NAME              Linux

-- CMAKE_SYSTEM_PROCESSOR         x86_64

你可以直接修改CMakeLists.txt文件中的28-42行,通过将USING_GCC 1修改为USING_CLANG 1来强制使用Clang:

# Determining compiler

if(CMAKE_C_COMPILER_ID MATCHES "GNU")

  set(USING_CLANG 1)

endif()

 

if(CMAKE_C_COMPILER_ID MATCHES "Clang")

  set(USING_CLANG 1)

endif()

构建出的代码路径为“build/bin/jerry”。

测试执行

首先,我们先禁用掉ASLR:

$ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

测试完成后,我们可以通过将值设置为2来重新启用ASLR:

$ echo 2 | sudo tee /proc/sys/kernel/randomize_va_space

现在,我们可以先尝试跟踪源码文件的地址,禁用ASLR将有助于我们在分析过程中不受干扰,且不会影响我们的结果。

现在,我们使用针对CVE-2023-36109的PoC文件来执行JerryScript,并尝试触发漏洞。根据漏洞描述,该漏洞位于jerry-core/ecma/base/ecma-helpers-string.c文件的ecma_stringbuilder_append_raw函数中,具体如下所示:

$ ./build/bin/jerry ./poc.js

[...]

guard: 0x55e17d12ac88 7bb PC 0x55e17d07ac6b in ecma_string_get_ascii_size ecma-helpers-string.c

guard: 0x55e17d12ac84 7ba PC 0x55e17d07acfe in ecma_string_get_ascii_size ecma-helpers-string.c

guard: 0x55e17d12ac94 7be PC 0x55e17d07ad46 in ecma_string_get_size (/jerryscript/build/bin/jerry+0x44d46) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12e87c 16b8 PC 0x55e17d09dfe1 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x67fe1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12ae04 81a PC 0x55e17d07bb64 in ecma_stringbuilder_append_raw (/jerryscript/build/bin/jerry+0x45b64) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12e890 16bd PC 0x55e17d09e053 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x68053) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12e8b8 16c7 PC 0x55e17d09e0f1 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x680f1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d133508 29db PC 0x55e17d0cc292 in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x96292) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d133528 29e3 PC 0x55e17d0cc5bd in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x965bd) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12f078 18b7 PC 0x55e17d040a78 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xaa78) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12f088 18bb PC 0x55e17d040ab4 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xaab4) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12f08c 18bc PC 0x55e17d040c26 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xac26) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

guard: 0x55e17d12f094 18be PC 0x55e17d040ca3 in jmem_heap_realloc_block (/jerryscript/build/bin/jerry+0xaca3) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

UndefinedBehaviorSanitizer:DEADLYSIGNAL

==27636==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x55e27da7950c (pc 0x7fe341fa092b bp 0x000000000000 sp 0x7ffc77634f18 T27636)

==27636==The signal is caused by a READ memory access.

    #0 0x7fe341fa092b  string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513

    #1 0x55e17d0cc3bb in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x963bb) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #2 0x55e17d09e103 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x68103) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #3 0x55e17d084a23 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4ea23) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #4 0x55e17d090ddc in ecma_op_function_call_native ecma-function-object.c

    #5 0x55e17d0909c1 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a9c1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #6 0x55e17d0d4743 in ecma_builtin_string_prototype_object_replace_helper ecma-builtin-string-prototype.c

    #7 0x55e17d084a23 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4ea23) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #8 0x55e17d090ddc in ecma_op_function_call_native ecma-function-object.c

    #9 0x55e17d0909c1 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a9c1) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #10 0x55e17d0b929f in vm_execute (/jerryscript/build/bin/jerry+0x8329f) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #11 0x55e17d0b8d4a in vm_run (/jerryscript/build/bin/jerry+0x82d4a) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #12 0x55e17d0b8dd0 in vm_run_global (/jerryscript/build/bin/jerry+0x82dd0) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #13 0x55e17d06d4a5 in jerry_run (/jerryscript/build/bin/jerry+0x374a5) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #14 0x55e17d069e32 in main (/jerryscript/build/bin/jerry+0x33e32) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

    #15 0x7fe341e29d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16

    #16 0x7fe341e29e3f in __libc_start_main csu/../csu/libc-start.c:392:3

    #17 0x55e17d0412d4 in _start (/jerryscript/build/bin/jerry+0xb2d4) (BuildId: 9588e1efabff4190fd492d05d3710c7810323407)

UndefinedBehaviorSanitizer can not provide additional info.

SUMMARY: UndefinedBehaviorSanitizer: SEGV string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513

==27636==ABORTING

通过使用这种技术,我们可以识别出ecma_stringbuilder_append_raw()中漏洞存在根本原因的栈地址。

如果我们仅仅依赖于Sanitizer来检测堆栈记录的话,我们将无法在输出中看到存在漏洞的函数名称:

$ ./build/bin/jerry ./poc.js

[COV] no shared memory bitmap available, skipping

[COV] edge counters initialized. Shared memory: (null) with 14587 edges

UndefinedBehaviorSanitizer:DEADLYSIGNAL

==54331==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x5622ae01350c (pc 0x7fc1925a092b bp 0x000000000000 sp 0x7ffed516b838 T54331)

==54331==The signal is caused by a READ memory access.

    #0 0x7fc1925a092b  string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513

    #1 0x5621ad66636b in ecma_builtin_replace_substitute (/jerryscript/build/bin/jerry+0x9636b) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #2 0x5621ad6380b3 in ecma_regexp_replace_helper (/jerryscript/build/bin/jerry+0x680b3) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #3 0x5621ad61e9d3 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4e9d3) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #4 0x5621ad62ad8c in ecma_op_function_call_native ecma-function-object.c

    #5 0x5621ad62a971 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a971) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #6 0x5621ad66e6f3 in ecma_builtin_string_prototype_object_replace_helper ecma-builtin-string-prototype.c

    #7 0x5621ad61e9d3 in ecma_builtin_dispatch_call (/jerryscript/build/bin/jerry+0x4e9d3) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #8 0x5621ad62ad8c in ecma_op_function_call_native ecma-function-object.c

    #9 0x5621ad62a971 in ecma_op_function_call (/jerryscript/build/bin/jerry+0x5a971) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #10 0x5621ad65324f in vm_execute (/jerryscript/build/bin/jerry+0x8324f) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #11 0x5621ad652cfa in vm_run (/jerryscript/build/bin/jerry+0x82cfa) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #12 0x5621ad652d80 in vm_run_global (/jerryscript/build/bin/jerry+0x82d80) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #13 0x5621ad607455 in jerry_run (/jerryscript/build/bin/jerry+0x37455) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #14 0x5621ad603e32 in main (/jerryscript/build/bin/jerry+0x33e32) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

    #15 0x7fc192429d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16

    #16 0x7fc192429e3f in __libc_start_main csu/../csu/libc-start.c:392:3

    #17 0x5621ad5db2d4 in _start (/jerryscript/build/bin/jerry+0xb2d4) (BuildId: 15a3c1cd9721e9f1b4e15fade2028ddca6dc542a)

 

UndefinedBehaviorSanitizer can not provide additional info.

SUMMARY: UndefinedBehaviorSanitizer: SEGV string/../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:513

==54331==ABORTING

总结

在这篇文章中,我们演示了如何通过扩展Fuzzilli的指令来对目标应用程序的栈进行实施跟踪,以更好地了解返回地址信息以及相关的源代码文件信息,从而给模糊测试工具提供更多的路径,最终产生更多有价值的测试结果。

参考资料

Not All Coverage Measurements Are Equal: Fuzzing by Coverage Accounting for Input Prioritization - NDSS Symposium

Clang C Language Family Frontend for LLVM

SanitizerCoverage — Clang 19.0.0git documentation

GitHub - googleprojectzero/fuzzilli: A JavaScript Engine Fuzzer

fuzzilli/Targets/Jerryscript/Patches/jerryscript.patch at main · googleprojectzero/fuzzilli · GitHub

GitHub - Limesss/CVE-2023-36109: a poc for cve-2023-36109

参考链接

Coverage Guided Fuzzing - Extending Instrumentation to Hunt Down Bugs Faster! - Include Security Research Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/645267.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全免费的数据恢复工具哪个好?分享2024年性价比超高的12款数据恢复软件!

当您丢失重要文件时&#xff0c;您应该可不想遇到措手不及的情况吧&#xff1f;相反&#xff0c;您需要在系统中使用一些可靠的数据恢复软件&#xff0c;但是全免费的数据恢复工具哪个好呢&#xff1f;别担心&#xff0c;本文将帮助您选择最适合您的解决方案。 如何挑选一款合适…

QT常量中有换行符

头文件添加&#xff1a; #pragma execution_character_set("utf-8")

我用LLaMA-Factory微调大模型来实现商品评论情感分析,准确率高达91.70%

大家好&#xff0c;我是程序锅。 最近在modelscope上闲逛的时候&#xff0c;在数据集板块发现有一个商品评论情感预测数据集。这个数据集源自一个比赛&#xff0c;它的目的是为了预测电商平台顾客的评论是好评还是差评。 数据示例如下所示&#xff08;其中0代表差评&#xff…

【YOLOv10训练教程】如何使用YOLOv10训练自己的数据集并且推理使用

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【二叉树】力扣OJ题

文章目录 前言1. 翻转二叉树1.1 题目1.2 解题思路1.3 代码实现1.4 时空复杂度 2. 对称二叉树2.1 题目2.2 解题思路2.3 代码实现2.4 时空复杂度 3. 平衡二叉树3.1 题目3.2 解题思路3.3 代码实现3.4 时空复杂度 结语 前言 本篇博客主要介绍二叉树的经典 OJ 题&#xff0c;题目主…

间接平差——以水准网平差为例 (python详细过程版)

目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,间接平差——以水准网平差为例 (python详细过程版),爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、原理概述 间接平差的函数模型和随机模型…

算法与数据结构汇总

刷题建议步骤 求职硬通货&#xff1a;一&#xff0c;好的学历&#xff0c;这个要下血本。本科&#xff0c;可以考研&#xff0c;读研。专科&#xff0c;可以专升本&#xff0c;再考研&#xff0c;读研&#xff0c;二&#xff0c;软考&#xff0c;一年考两次&#xff0c;有些科…

MySQL:表的约束

文章目录 0.小知识&#xff0c;数据转化1.空属性(非空约束)2.默认值&#xff08;default&#xff09;3.comment&#xff08;列描述&#xff09;4.zerofill(显示约束)5.primary key(主键约束)6.auto_increment(自增长)7.unique(唯一键)8.foreign key (外键)9.综合表结构的设计 表…

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候&#xff0c;需要选择支持的最低 API Level 和使用的 NDK 版本&#xff0c;对应开发 app 的最低 SDK 版本&#xff1a; 在 app 的 build.gradle 文件里&#xff0c;对应于代码如下&#xff1a; 目前各版本的占有率情况如下&#xf…

docker不删除容器更改其挂载目录

场景&#xff1a;docker搭建的jenkins通常需要配置很多开发环境&#xff0c;当要更换挂载目录&#xff0c;每次都需要删除容器重新运行&#xff0c;不在挂载目录的环境通常不会保留。 先给一个参考博客docker不删除容器&#xff0c;修改容器挂载或其他_jenkins 修改容器挂载do…

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell

电子电器架构 - AUTOSAR软件架构Current Features in a Nutshell 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的…

Gradle的settings.gradle.kts你真的理解吗?

你还在用.gradle文件吗&#xff1f;例如build.gradle、settings.gradle&#xff0c;那么你就out了。现在我们有必要了解一下kts脚本了。在Android项目中&#xff0c;默认有3个文件可以替换成kts脚本&#xff0c;即project的build.gradle、app模块的build.gradle和project的sett…

数据库(5)——DDL 表操作

表查询 先要进入到某一个数据库中才可使用这些指令。 SHOW TABLES; 可查询当前数据库中所有的表。 表创建 CREATE TABLE 表名( 字段1 类型 [COMMENT 字段1注释] ...... 字段n 类型 [COMMENT 字段n注释] )[COMMENT 表注释]; 例如&#xff0c;在student数据库里创建一张studen…

哈希表---闭散列

闭散列 当我们用哈希函数的时候&#xff0c;其中一个就是除留余数法 取这个表的长度len,按照哈希函数&#xff1a;Hash(key) key% len,将这个位置映射到表中 通过上面的除留余数法&#xff0c;会有哈希碰撞的问题&#xff0c;可以通过闭散列来解决 闭散列也叫开放定址法&am…

Django与前端框架协作开发实战:高效构建现代Web应用

title: Django与前端框架协作开发实战&#xff1a;高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 后端开发 tags: DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理 第1章&#xff1a;简介 1.1 Django简介 Django是一…

新加坡多ip服务器在跨境电商中有哪些优势?

新加坡多IP服务器**在跨境外贸业务中具有明显的优势&#xff0c;适合需要高性能和网络稳定性的业务场景。Rak部落小编为您整理发布新加坡多ip服务器在跨境电商中有哪些优势? 以下是一些具体的优势&#xff1a; 1. **地理位置优越**&#xff1a;新加坡作为亚太地区的国际商业和…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

R语言:Mantel Test分析与绘图

Mantel Test 1.什么是Mantel Test2. R语言代码13. R语言代码2 1.什么是Mantel Test Mantel test分析对两个矩阵相关关系进行检验。可以用在生态学上&#xff0c;用来检验群落距离矩阵(如 Bray-Curtis distance matrix)和环境变量距离矩阵(如 pH, 温度 或者地理位置的差异矩阵)之…

MySQL——MySQL目录结构

MySQL安装完成后&#xff0c;会在磁盘上生成一个目录&#xff0c;该目录被称为MySQL的安装目录。在MySQL的安装目录中包含了启动文件、配置文件、数据库文件和命令文件等。 下面对 MySQL 的安装目录进行详细讲解 (1)bin 目录 : 用于放置一些可执行文件,如 mysql.exe、mysqld. …

Java面试八股之什么是锁消除和锁粗化

什么是锁消除和锁粗化 锁消除&#xff08;Lock Elimination&#xff09;&#xff1a; 锁消除是Java虚拟机&#xff08;JVM&#xff09;进行的一种高级优化策略&#xff0c;旨在消除那些没有必要存在的同步操作&#xff0c;以减少不必要的性能开销。这一优化发生在即时编译器&a…