色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

MSVCRT.LIB技術(shù)的實(shí)現(xiàn)細(xì)節(jié)介紹

蛇矛實(shí)驗(yàn)室 ? 來源:蛇矛實(shí)驗(yàn)室 ? 2023-04-15 10:28 ? 次閱讀

1. 序言

供應(yīng)鏈攻擊是一種傳播間諜軟件的方式,一般通過產(chǎn)品軟件官網(wǎng)或軟件包存儲庫進(jìn)行傳播。通常來說,黑客會(huì)瞄準(zhǔn)部署知名軟件官網(wǎng)的服務(wù)器,篡改服務(wù)器上供普通用戶下載的軟件源代碼,將間諜軟件傳播給前往官網(wǎng)下載軟件的用戶。在實(shí)施攻擊時(shí),有一種方式是通過污染上游廠商的編譯環(huán)境來攜帶攻擊者的惡意載荷。

在污染編譯環(huán)境時(shí),對污染文件的選擇上,需要關(guān)注兩個(gè)重點(diǎn),第一,要確保被污染分代碼能夠被編譯進(jìn)目標(biāo)程序,第二,需要足夠隱蔽,防止被安全工具檢測到。在Windows環(huán)境下,通過替換MSVC的C標(biāo)準(zhǔn)運(yùn)行庫的方式可以同時(shí)達(dá)到上訴兩種要求,下面詳細(xì)介紹該技術(shù)的實(shí)現(xiàn)細(xì)節(jié)。

2. 環(huán)境與工具

靶場Windows靶機(jī)

任意版本visualstudio

MSVC組件

3. MSVC組件

MSVC全稱Microsoft Visual C++,是微軟公司的免費(fèi)C++開發(fā)工具,具有集成開發(fā)環(huán)境,可提供編輯C語言,C++以及C++/CLI等編程語言。VC++集成了便利的除錯(cuò)工具,特別是集成了微軟Windows視窗操作系統(tǒng)應(yīng)用程序接口(Windows API)、三維動(dòng)畫DirectX API,Microsoft .NET框架。可以通過打開Visual Studio Installer查看MSVC組件文件目錄,需要污染的C標(biāo)準(zhǔn)運(yùn)行庫就是在該目錄下。

e0fe2cc6-dab8-11ed-bfe3-dac502259ad0.png

MSVC有多個(gè)版本,可以通過設(shè)置中的平臺工具集確認(rèn)自己當(dāng)前使用的版本,由于筆者當(dāng)前使用的版本是v143,即14.3。

e1332ce6-dab8-11ed-bfe3-dac502259ad0.png

4. C標(biāo)準(zhǔn)運(yùn)行庫-MSVCRT.LIB

1. 什么是MSVCRT.LIB

Visual Studio使用的CRT靜態(tài)庫文件為MSVCRT.LIB,CRT全程為C runtime Library,意義為Windows的C標(biāo)準(zhǔn)運(yùn)行庫,初始CRT的代碼位于多個(gè)庫文件中,大多數(shù)軟件發(fā)布時(shí)使用運(yùn)行庫的動(dòng)態(tài)多線程RELEASE版本,該種方式在編譯時(shí)需要用到MSVCRT.LIB。

e1594da4-dab8-11ed-bfe3-dac502259ad0.png圖:MSVC的CRT初始化庫

如果對程序進(jìn)行調(diào)試,觀察程序的調(diào)用堆棧,會(huì)發(fā)現(xiàn)程序并非是從編寫的main函數(shù)開始執(zhí)行的,這是因?yàn)?a target="_blank">開發(fā)者編寫C代碼時(shí),入口點(diǎn)雖然為main函數(shù),但是在程序運(yùn)行時(shí),程序真正的入口點(diǎn)為mainCRTStartup函數(shù),在編譯時(shí)會(huì)將MSVCRT.LIB的內(nèi)容鏈接到開發(fā)者自定義代碼之前。

e1771546-dab8-11ed-bfe3-dac502259ad0.png

2. MSVCRT.LIB的路徑

上文中,我們介紹過MSVC組件的路徑,并確定使用的版本為14.3,MSVCRT.LIB文件及其源碼均在該目錄下。源碼文件在crtsrcvcruntime中,MSVCRT.LIB在lib文件下存在多種版本,本文使用x86下的MSVCRT.LIB進(jìn)行演示。

e1a214a8-dab8-11ed-bfe3-dac502259ad0.png

3. 程序的執(zhí)行流程

在程序運(yùn)行時(shí),真正的入口點(diǎn)為mainCRTStartup函數(shù),該程序被定義在exe_main.cpp中,其源碼如下。

#define_SCRT_STARTUP_MAIN
#include"exe_common.inl"
extern"C"DWORD mainCRTStartup(LPVOID)
{
return__scrt_common_main();
}

可以看到mainCRTStartup調(diào)用了scrt_common_main,根據(jù)include我們可以知道scrt_common_main被定義在了exe_common.inl中,exe_common.inl的部分代碼如下。

static__declspec(noinline) int__cdecl __scrt_common_main_seh()
{
if(!__scrt_initialize_crt(__scrt_module_type::exe))
__scrt_fastfail(FAST_FAIL_FATAL_APP_EXIT);

boolhas_cctor = false;
__try
{
boolconstis_nested = __scrt_acquire_startup_lock();

if(__scrt_current_native_startup_state == __scrt_native_startup_state::initializing)
{
__scrt_fastfail(FAST_FAIL_FATAL_APP_EXIT);
}
elseif(__scrt_current_native_startup_state == __scrt_native_startup_state::uninitialized)
{
__scrt_current_native_startup_state = __scrt_native_startup_state::initializing;

if(_initterm_e(__xi_a, __xi_z) != 0)
return255;

_initterm(__xc_a, __xc_z);

__scrt_current_native_startup_state = __scrt_native_startup_state::initialized;
}
else
{
has_cctor = true;
}

__scrt_release_startup_lock(is_nested);

// If this module has any dynamically initialized __declspec(thread)
// variables, then we invoke their initialization for the primary thread
// used to start the process:
_tls_callback_type const* consttls_init_callback = __scrt_get_dyn_tls_init_callback();
if(*tls_init_callback != nullptr&& __scrt_is_nonwritable_in_current_image(tls_init_callback))
{
(*tls_init_callback)(nullptr, DLL_THREAD_ATTACH, nullptr);
}

// If this module has any thread-local destructors, register the
// callback function with the Unified CRT to run on exit.
_tls_callback_type const* consttls_dtor_callback = __scrt_get_dyn_tls_dtor_callback();
if(*tls_dtor_callback != nullptr&& __scrt_is_nonwritable_in_current_image(tls_dtor_callback))
{
_register_thread_local_exe_atexit_callback(*tls_dtor_callback);
}

//
// Initialization is complete; invoke main...
//

intconstmain_result = invoke_main();

//
// main has returned; exit somehow...
//

if(!__scrt_is_managed_app())
exit(main_result);

if(!has_cctor)
_cexit();

// Finally, we terminate the CRT:
__scrt_uninitialize_crt(true, false);
returnmain_result;
}
__except (_seh_filter_exe(GetExceptionCode(), GetExceptionInformation()))
{
// Note:We should never reach this except clause.
intconstmain_result = GetExceptionCode();

if(!__scrt_is_managed_app())
_exit(main_result);

if(!has_cctor)
_c_exit();

returnmain_result;
}
}



// This is the common main implementation to which all of the CRT main functions
// delegate (for executables; DLLs are handled separately).
static__forceinline int__cdecl __scrt_common_main()
{
// The /GS security cookie must be initialized before any exception handling
// targeting the current image is registered. No function using exception
// handling can be called in the current image until after this call:
__security_init_cookie();

return__scrt_common_main_seh();
}

觀察源碼我們可以看到scrt_common_main中調(diào)用了安全cookie與scrt_common_main_seh,scrt_common_main_seh中通過invoke_main到達(dá)用戶定義的main函數(shù),其調(diào)用如下圖所示。

e1d3847a-dab8-11ed-bfe3-dac502259ad0.png

上訴內(nèi)容執(zhí)行早于main函數(shù),所以污染MSVCRT.LIB文件可以確保注入的代碼必然被執(zhí)行,又因上訴函數(shù)調(diào)用非敏感函數(shù),通常安全工具不會(huì)對其進(jìn)行檢測,因此保證了隱蔽性。

5. 編譯環(huán)境污染

1. 文件編譯

在源碼中,我們挑選一個(gè)文件進(jìn)行代碼注入,本文選擇dyn_tls_init.c進(jìn)行演示,dyn_tls_init.c的源碼如下。

//
// dyn_tls_init.c
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// This source file provides a fallback definition of __dyn_tls_init_callback,
// used whenever TLS initialization is not required.
//
// This relies on a feature of the C compiler known as "communal variables."
// This does not work in C++, and the linker's alternatename features is not
// sufficient here.
//
#include

#pragmawarning(disable: 4132) // const object should be initialized
constPIMAGE_TLS_CALLBACK __dyn_tls_init_callback;

PIMAGE_TLS_CALLBACK const* __cdecl __scrt_get_dyn_tls_init_callback()
{
return&__dyn_tls_init_callback;
}

添加一些自定義代碼

#include

#pragmawarning(disable: 4132) // const object should be initialized
constPIMAGE_TLS_CALLBACK __dyn_tls_init_callback;
add(intx,inty){
returnx + y;
}
PIMAGE_TLS_CALLBACK const* __cdecl __scrt_get_dyn_tls_init_callback()
{
intx = 1;
inty = 2;
intz = add(x, y);
return&__dyn_tls_init_callback;
}

關(guān)閉編譯優(yōu)化選項(xiàng),此過程不可省略,CTRL+F7編譯;

e20fdd3a-dab8-11ed-bfe3-dac502259ad0.png

將編譯好的obj文件拷貝出來。

e2197fb6-dab8-11ed-bfe3-dac502259ad0.png

2. 清理原始o(jì)bj

obj文件就是c文件編譯之后產(chǎn)生的一種文件,一個(gè)c文件編譯之后只會(huì)產(chǎn)生一個(gè)obj文件,一個(gè)lib文件是obj文件的集合,當(dāng)然,其中還夾雜著其他一些輔助信息,目的是為了讓編譯器能夠準(zhǔn)確找到對應(yīng)的obj文件,這些文件一起通過AR打包。我們需要找到這些輔助信息完成LIB文件中obj目標(biāo)文件的替換。obj文件可以利用類似7z工具進(jìn)行解包,解壓后如下。

e24ca242-dab8-11ed-bfe3-dac502259ad0.png

在目錄中有兩個(gè)文本文件,里面記錄了obj文件對應(yīng)信息,搜索dyn_tls_init.obj,搜索到D:a_work1sIntermediatecrtvcstartupuildmdmsvcrt_kernel32msvcrt_kernel32.nativeprojobjrx86dyn_tls_init.obj,該值為dyn_tls_init.obj打包時(shí)文件的路徑。刪除MSVCRT.LIB文件中dyn_tls_init.obj的相關(guān)信息,刪除obj需要link.exe工具,該工具在MSVC的bin目錄下,刪除指令如下。

link-lib"XX:XXXmsvcrt.lib" -remove:D:a\_work1sIntermediatecrtvcstartupbuildmdmsvcrt_kernel32msvcrt_kernel32.nativeprojobjrx86dyn_tls_init.obj

3. 寫入新編譯obj

在清理完原始o(jì)bj文件后,將新編譯好的obj文件寫入lib文件,解壓lib文件后,可以發(fā)現(xiàn)除了文本文件外,還有一個(gè)文件夾名為D_,該文件夾代表obj文件打包前所在的磁盤盤符,也就是D盤。在通過MSVC的工具進(jìn)行打包時(shí),會(huì)根據(jù)obj所在路徑創(chuàng)建對應(yīng)的文件,并將obj的路徑記錄到里面的文本文件中。也就是說新編譯好的文件不需要與原始o(jì)bj文件在相同目錄下,但是為了看起來更加完美,建議根據(jù)文本文件中的地址為編譯好的obj文件創(chuàng)建相同的路徑。寫入lib文件需要用到lib.exe工具,使用指令如下。

lib "XX:XXXmsvcrt.lib""D:a\_work1sIntermediatecrtvcstartupuildmdmsvcrt_kernel32msvcrt_kernel32.nativeprojobjrx86dyn_tls_init.obj”

寫入obj后,新建一個(gè)C/C++的項(xiàng)目,隨意編寫一些代碼。

e2771db0-dab8-11ed-bfe3-dac502259ad0.png

編譯后使用反匯編工具查看main之前的代碼,發(fā)現(xiàn)寫入dyn_tls_init.obj的功能已經(jīng)被編譯到工程中,反匯編代碼如下。

call___scrt_release_startup_lock
pop ecx
callsub_401CD0
mov esi, eax
xoredi, edi
cmp [esi], edi
jz shortloc_401783
push esi
call___scrt_is_nonwritable_in_current_image
pop ecx
testal, al
jz shortloc_401783
mov esi, [esi]
push edi
push 2
push edi
mov ecx, esi
callds:___guard_check_icall_fptr
callesi
callsub_401D0B
mov esi, eax
cmp [esi], edi
jz shortloc_4017A1
push esi
call___scrt_is_nonwritable_in_current_image
pop ecx
testal, al
jz shortloc_4017A1
push dword ptr [esi] ; Callback
call_register_thread_local_exe_atexit_callback
pop ecx
call_get_initial_narrow_environment
mov edi, eax
call__p___argv
mov esi, [eax]
call__p___argc
push edi ; envp
push esi ; argv
push dword ptr [eax] ; argc
call_main
##注入的內(nèi)容
#sub_401CD0
pushebp
movebp, esp
subesp, 0Ch
mov[ebp+var_8], 1
mov[ebp+var_4], 2
moveax, [ebp+var_4]
pusheax
movecx, [ebp+var_8]
pushecx
callsub_401D00
addesp, 8
mov[ebp+var_C], eax
moveax, offsetunk_405380
movesp, ebp
popebp
retn
#sub_401D00
pushebp
movebp, esp
moveax, [ebp+arg_0]
addeax, [ebp+arg_4]
popebp
retn
endp

6. 總結(jié)

通過上訴例子可以看出,污染CRT靜態(tài)庫文件的方式簡單易用,且具有很高的隱蔽性,當(dāng)攻陷對方編譯服務(wù)器時(shí),該方式危害極大,因其與源碼一同被編譯到項(xiàng)目中,會(huì)攜帶合法簽名。希望在大家在了解其工作原理后,不僅收獲了一種新的代碼劫持技能,在分析惡意軟件時(shí)也多了一個(gè)思路。

丈八網(wǎng)安蛇矛實(shí)驗(yàn)室成立于2020年,致力于安全研究、攻防解決方案以及靶場仿真復(fù)現(xiàn)等相關(guān)方向。團(tuán)隊(duì)核心成員均由從事安全行業(yè)10余年經(jīng)驗(yàn)的安全專家組成,團(tuán)隊(duì)目前成員涉及紅藍(lán)對抗、滲透測試、逆向破解、病毒分析、工控安全以及免殺等相關(guān)領(lǐng)域。





審核編輯:劉清

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

    關(guān)注

    0

    文章

    5

    瀏覽量

    6660
  • 匯編語言
    +關(guān)注

    關(guān)注

    14

    文章

    410

    瀏覽量

    35856
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7009
  • CLI
    CLI
    +關(guān)注

    關(guān)注

    1

    文章

    79

    瀏覽量

    8572

原文標(biāo)題:供應(yīng)鏈攻擊之編譯環(huán)境

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

收藏 人收藏

    評論

    相關(guān)推薦

    巧用命令實(shí)現(xiàn)PG LIB的增量式生成

    Liberty(俗稱LIB和DB),是后端設(shè)計(jì)中重要的庫邏輯描述文件,這里邊包含了除過physical(當(dāng)然也有一點(diǎn)點(diǎn)涉及)以外所有的信息,對整個(gè)后端設(shè)計(jì)實(shí)現(xiàn)有非常大的作用。
    的頭像 發(fā)表于 11-03 12:56 ?881次閱讀
    巧用命令<b class='flag-5'>實(shí)現(xiàn)</b>PG <b class='flag-5'>LIB</b>的增量式生成

    嵌入式系統(tǒng)設(shè)計(jì)時(shí)需要注意的技術(shù)要點(diǎn)和實(shí)現(xiàn)細(xì)節(jié)有哪些?

    為什么需要safe mode?嵌入式系統(tǒng)設(shè)計(jì)時(shí)需要注意的技術(shù)要點(diǎn)和實(shí)現(xiàn)細(xì)節(jié)有哪些?
    發(fā)表于 04-25 08:49

    分立器件的實(shí)現(xiàn)細(xì)節(jié)

    ?概述負(fù)載開關(guān)電路日常應(yīng)用比較廣泛,主要用來控制后級負(fù)載的電源開關(guān)。此功能可以直接用IC也可以用分立器件搭建,分立器件主要用PMOS加三極管實(shí)現(xiàn)。本文主要討論分立器件的實(shí)現(xiàn)細(xì)節(jié)。電路分析如下圖所示R5模擬后級負(fù)載,Q1為開關(guān),
    發(fā)表于 10-28 08:28

    Linux下的lib文件故障解決實(shí)例

    Linux下的lib文件故障解決實(shí)例
    發(fā)表于 09-11 08:48 ?4次下載
    Linux下的<b class='flag-5'>lib</b>文件故障解決實(shí)例

    時(shí)序分析基本概念介紹——時(shí)序庫Lib,除了這些你還想知道什么?

    時(shí)序分析基本概念介紹——時(shí)序庫Lib。用于描述物理單元的時(shí)序和功耗信息的重要庫文件。lib庫是最基本的時(shí)序庫,通常文件很大,分為兩個(gè)部分。
    的頭像 發(fā)表于 12-15 17:11 ?1.2w次閱讀
    時(shí)序分析基本概念<b class='flag-5'>介紹</b>——時(shí)序庫<b class='flag-5'>Lib</b>,除了這些你還想知道什么?

    Cadence小技巧:利用lib功能免除新ADE的設(shè)置

    Cadence小技巧有很多,今天就來介紹一種利用lib功能免除新ADE的設(shè)置的辦法。詳細(xì)的內(nèi)容請看文章。
    的頭像 發(fā)表于 02-18 15:00 ?8302次閱讀
    Cadence小技巧:利用<b class='flag-5'>lib</b>功能免除新ADE的設(shè)置

    使用Lib實(shí)現(xiàn)24C02的程序資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用Lib實(shí)現(xiàn)24C02的程序資料免費(fèi)下載
    發(fā)表于 05-06 17:11 ?12次下載
    使用<b class='flag-5'>Lib</b><b class='flag-5'>實(shí)現(xiàn)</b>24C02的程序資料免費(fèi)下載

    keil和IAR中lib庫文件的生成和使用

    lib靜態(tài)庫的使用可以簡化項(xiàng)目開發(fā)流程,提高開發(fā)效率,本文詳細(xì)介紹了在keil和IAR環(huán)境下lib庫的生成和使用。
    發(fā)表于 12-03 11:51 ?15次下載
    keil和IAR中<b class='flag-5'>lib</b>庫文件的生成和使用

    bitcoinjs-lib比特幣客戶端功能的javascript實(shí)現(xiàn)

    bitcoinjs-lib.zip
    發(fā)表于 06-06 16:35 ?2次下載
    bitcoinjs-<b class='flag-5'>lib</b>比特幣客戶端功能的javascript<b class='flag-5'>實(shí)現(xiàn)</b>

    lib-zjson C++版JSON庫

    ./oschina_soft/gitee-lib-zjson.zip
    發(fā)表于 06-17 09:58 ?0次下載
    <b class='flag-5'>lib</b>-zjson C++版JSON庫

    AN075 基于MDK實(shí)現(xiàn)Lib庫調(diào)用方案介紹

    AN075 基于MDK實(shí)現(xiàn)Lib庫調(diào)用方案介紹
    發(fā)表于 03-01 18:56 ?0次下載
    AN075 基于MDK<b class='flag-5'>實(shí)現(xiàn)</b>的<b class='flag-5'>Lib</b>庫調(diào)用方案<b class='flag-5'>介紹</b>

    時(shí)序分析基本概念介紹—時(shí)序庫Lib

    今天主要介紹的時(shí)序概念是時(shí)序庫lib,全稱liberty library format(以? lib結(jié)尾),
    的頭像 發(fā)表于 07-07 17:15 ?3185次閱讀
    時(shí)序分析基本概念<b class='flag-5'>介紹</b>—時(shí)序庫<b class='flag-5'>Lib</b>

    e2 studio創(chuàng)建lib文件及使用

    目錄 一、 簡介 二、 制作lib文件 三、 調(diào)用庫函數(shù) 四、 總結(jié) 一、簡介 工程師在開發(fā)過程中時(shí)常會(huì)因?yàn)楦鞣N原因,想要把部分代碼封裝成庫函數(shù)。e 2 studio自帶建立庫函數(shù)工程的功能,本文
    的頭像 發(fā)表于 07-12 12:05 ?1200次閱讀
    e2 studio創(chuàng)建<b class='flag-5'>lib</b>文件及使用

    介紹一種測試標(biāo)準(zhǔn)單元lib的方法

    不知道大家有沒有想過,拿到手一個(gè)標(biāo)準(zhǔn)單元的lib,它里面的那些參數(shù)是怎么得出來的?我們做出來的芯片成品,真的會(huì)按lib里描述的那樣,timing的值分毫不差嗎?
    的頭像 發(fā)表于 12-06 15:26 ?516次閱讀

    e2 studio創(chuàng)建lib文件及使用

    e2 studio創(chuàng)建lib文件及使用
    的頭像 發(fā)表于 01-18 08:06 ?508次閱讀
    e2 studio創(chuàng)建<b class='flag-5'>lib</b>文件及使用
    主站蜘蛛池模板: 亚洲精品久久久久一区二区三| 91精品视频网站| 色多多旧版污污破解版| 日韩欧美一区二区三区免费观看| 全黄h全肉细节文在线观看| 日本不卡一二三| 少妇人妻偷人精品视蜜桃| 性女传奇 快播| 一进一出抽搐gif免费60秒| 2020精品国产视| WWW国产精品人妻一二三区| 国产不卡在线观看视频| 国语自产二区高清国语自产拍| 久久精品国产欧美日韩99热| 男生脱美女内裤内衣动态图| 日韩精品久久日日躁夜夜躁影视| 午夜国产精品免费观看| 伊人久久综合成人亚洲| yw193.c国产在线观看| 国产精品无码人妻99999| 久久re视频这里精品青| 妻子的妹妹在线| 亚洲、国产综合视频| 最近中文字幕免费高清MV视频6| XXXchinese国产HD| 国产亚洲精品网站在线视频| 麻豆国产自制在线观看| 伸到同桌奶罩里捏她胸h| 亚洲中文在线偷拍| 999精品免费视频| 国产精品成久久久久三级四虎 | 午夜射精日本三级| 最新无码国产在线视频| 高hbl双性浪荡古代| 久久www99re在线播放| 青青草国产精品久久| 亚洲国产免费观看视频| 99久久国产综合精品| 国产一区二区无码蜜芽精品| 女人被弄到高潮叫床免| 亚洲精品无码午夜福利在线观看|