国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

4.8 x64dbg 學(xué)會(huì)掃描應(yīng)用堆棧

這篇具有很好參考價(jià)值的文章主要介紹了4.8 x64dbg 學(xué)會(huì)掃描應(yīng)用堆棧。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

堆棧是計(jì)算機(jī)中的兩種重要數(shù)據(jù)結(jié)構(gòu) 堆(Heap)和棧(Stack)它們?cè)谟?jì)算機(jī)程序中起著關(guān)鍵作用,在內(nèi)存中堆區(qū)(用于動(dòng)態(tài)內(nèi)存分配)和棧區(qū)(用于存儲(chǔ)函數(shù)調(diào)用、局部變量等臨時(shí)數(shù)據(jù)),進(jìn)程在運(yùn)行時(shí)會(huì)使用堆棧進(jìn)行參數(shù)傳遞,這些參數(shù)包括局部變量,臨時(shí)空間以及函數(shù)切換時(shí)所需要的棧幀等。

  • 棧(Stack)是一種遵循后進(jìn)先出(LIFO)原則的線性數(shù)據(jù)結(jié)構(gòu)。它主要用于存儲(chǔ)和管理程序中的臨時(shí)數(shù)據(jù),如函數(shù)調(diào)用和局部變量。棧的主要操作包括壓棧(添加元素)和彈棧(移除元素)。
  • 堆(Heap)是一種樹形數(shù)據(jù)結(jié)構(gòu),通常用于實(shí)現(xiàn)優(yōu)先隊(duì)列。堆中的每個(gè)節(jié)點(diǎn)都有一個(gè)鍵值(key),并滿足特定性質(zhì)。最常見的堆類型是二叉堆(包括最大堆和最小堆)。堆在計(jì)算機(jī)程序中的應(yīng)用包括堆排序算法和內(nèi)存管理等。

而針對(duì)棧地址的分析在漏洞挖掘中尤為重要,棧溢出(Stack Overflow)是一種計(jì)算機(jī)程序中的運(yùn)行時(shí)錯(cuò)誤,通常發(fā)生在緩沖區(qū)(buffer)中。緩沖區(qū)是一段內(nèi)存空間,用于臨時(shí)存儲(chǔ)數(shù)據(jù)。當(dāng)程序試圖向棧中寫入過多數(shù)據(jù)時(shí),可能導(dǎo)致棧溢出,從而破壞其他內(nèi)存區(qū)域或?qū)е鲁绦虮罎ⅲ瑖?yán)重的則可能會(huì)導(dǎo)致黑客控制EIP指針,而執(zhí)行惡意代碼。

棧溢出的原因主要有以下幾點(diǎn):

  • 遞歸調(diào)用過深:當(dāng)函數(shù)遞歸調(diào)用自身的層次過深時(shí),可能導(dǎo)致棧溢出。這是因?yàn)槊看魏瘮?shù)調(diào)用都會(huì)在棧中分配內(nèi)存,用于存儲(chǔ)函數(shù)的局部變量和返回地址。如果遞歸層數(shù)太多,可能導(dǎo)致??臻g不足,從而引發(fā)棧溢出。

  • 局部變量占用過多??臻g:如果函數(shù)中的局部變量(尤其是數(shù)組和結(jié)構(gòu)體)占用過多??臻g,可能導(dǎo)致棧溢出。這種情況下,可以考慮將部分局部變量移到堆內(nèi)存中,以減小??臻g的壓力。

  • 緩沖區(qū)溢出:當(dāng)程序向緩沖區(qū)寫入的數(shù)據(jù)超過其分配的空間時(shí),可能發(fā)生緩沖區(qū)溢出。這種溢出可能導(dǎo)致棧空間中的其他數(shù)據(jù)被破壞,從而引發(fā)棧溢出。

LyScript 插件中提供了針對(duì)堆棧的操作函數(shù),對(duì)于堆的開辟與釋放通??墒褂?code>create_alloc()及delete_alloc()在之前的文章中我們已經(jīng)使用了堆創(chuàng)建函數(shù),本章我們將重點(diǎn)學(xué)習(xí)針對(duì)棧的操作函數(shù),棧操作函數(shù)有三種,其中push_stack用于入棧,pop_stack用于出棧,而最有用的還屬peek_stack函數(shù),該函數(shù)可用于檢查指定堆棧位置處的內(nèi)存參數(shù),利用這個(gè)特性就可以實(shí)現(xiàn),對(duì)堆棧地址的檢測(cè),或?qū)Χ褩5膾呙璧取?/p>

讀者注意:由于peek_stack命令傳入的堆棧下標(biāo)位置默認(rèn)從0開始,而輸出的結(jié)果則一個(gè)十進(jìn)制有符號(hào)長(zhǎng)整數(shù),一般而言有符號(hào)數(shù)會(huì)出現(xiàn)復(fù)數(shù)的情形,讀者在使用時(shí)應(yīng)更具自己的需求自行轉(zhuǎn)換。

而針對(duì)有符號(hào)與無(wú)符號(hào)數(shù)的轉(zhuǎn)換也很容易實(shí)現(xiàn),long_to_ulong函數(shù)用于將有符號(hào)整數(shù)轉(zhuǎn)換為無(wú)符號(hào)整數(shù)(long_to_ulong)而與之對(duì)應(yīng)的ulong_to_long函數(shù),則用于將無(wú)符號(hào)整數(shù)轉(zhuǎn)換為有符號(hào)整數(shù)(ulong_to_long)。這些函數(shù)都接受一個(gè)整數(shù)參數(shù)(inter)和一個(gè)布爾參數(shù)(is_64)。當(dāng) is_64False 時(shí),函數(shù)處理32位整數(shù);當(dāng) is_64True 時(shí),函數(shù)處理64位整數(shù)。

  • 有符號(hào)整數(shù)轉(zhuǎn)無(wú)符號(hào)數(shù)(long_to_ulong):通過將輸入整數(shù)與相應(yīng)位數(shù)的最大值執(zhí)行按位與操作(&)來實(shí)現(xiàn)轉(zhuǎn)換。對(duì)于32位整數(shù),使用 (1 << 32) - 1 計(jì)算最大值;對(duì)于64位整數(shù),使用 (1 << 64) - 1 計(jì)算最大值。

  • 無(wú)符號(hào)整數(shù)轉(zhuǎn)有符號(hào)數(shù)(ulong_to_long):通過計(jì)算輸入整數(shù)與相應(yīng)位數(shù)的最高位的差值來實(shí)現(xiàn)轉(zhuǎn)換。首先,它使用按位與操作(&)來計(jì)算輸入整數(shù)與最高位之間的關(guān)系。對(duì)于32位整數(shù),使用 (1 << 31) - 1 和 (1 << 31);對(duì)于64位整數(shù),使用(1 << 63) - 1 (1 << 63)。然后,將這兩個(gè)結(jié)果相減以獲得有符號(hào)整數(shù)。

from LyScript32 import MyDebug

# 有符號(hào)整數(shù)轉(zhuǎn)無(wú)符號(hào)數(shù)
def long_to_ulong(inter,is_64 = False):
    if is_64 == False:
        return inter & ((1 << 32) - 1)
    else:
        return inter & ((1 << 64) - 1)

# 無(wú)符號(hào)整數(shù)轉(zhuǎn)有符號(hào)數(shù)
def ulong_to_long(inter,is_64 = False):
    if is_64 == False:
        return (inter & ((1 << 31) - 1)) - (inter & (1 << 31))
    else:
        return (inter & ((1 << 63) - 1)) - (inter & (1 << 63))

if __name__ == "__main__":
    dbg = MyDebug()

    connect_flag = dbg.connect()
    print("連接狀態(tài): {}".format(connect_flag))

    for index in range(0,10):

        # 默認(rèn)返回有符號(hào)數(shù)
        stack_address = dbg.peek_stack(index)

        # 使用轉(zhuǎn)換
        print("默認(rèn)有符號(hào)數(shù): {:15} --> 轉(zhuǎn)為無(wú)符號(hào)數(shù): {:15} --> 轉(zhuǎn)為有符號(hào)數(shù): {:15}".
              format(stack_address, long_to_ulong(stack_address),ulong_to_long(long_to_ulong(stack_address))))

    dbg.close()

如上代碼中我們?cè)诋?dāng)前堆棧中向下掃描10條,并通過轉(zhuǎn)換函數(shù)以此輸出該堆棧信息的有符號(hào)與無(wú)符號(hào)形式,這段代碼輸出效果如下圖所示;

4.8 x64dbg 學(xué)會(huì)掃描應(yīng)用堆棧

我們繼續(xù)完善這個(gè)功能,通過使用get_disasm_one_code()獲取到堆棧的反匯編代碼,并以此來進(jìn)行更多的判斷形勢(shì),如下代碼中只需要增加反匯編一行功能即可。

if __name__ == "__main__":
    dbg = MyDebug()

    connect_flag = dbg.connect()
    print("連接狀態(tài): {}".format(connect_flag))

    for index in range(0,10):

        # 默認(rèn)返回有符號(hào)數(shù)
        stack_address = dbg.peek_stack(index)

        # 反匯編一行
        dasm = dbg.get_disasm_one_code(stack_address)

        # 根據(jù)地址得到模塊基址
        if stack_address <= 0:
            mod_base = 0
        else:
            mod_base = dbg.get_base_from_address(long_to_ulong(stack_address))

        print("stack => [{}] addr = {:10} base = {:10} dasm = {}".format(index, hex(long_to_ulong(stack_address)),hex(mod_base), dasm))

    dbg.close()

運(yùn)行上代碼,將自動(dòng)掃描前十行堆棧中的反匯編指令,并輸出如下圖所示的功能;

4.8 x64dbg 學(xué)會(huì)掃描應(yīng)用堆棧

如上圖我們可以得到堆棧處的反匯編參數(shù),但如果我們需要檢索堆棧特定區(qū)域內(nèi)是否存在返回到模塊的地址,該如何實(shí)現(xiàn)呢?

該功能的實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,首先需要得到程序全局狀態(tài)下的所有加載模塊的基地址,然后得到當(dāng)前堆棧內(nèi)存地址內(nèi)的實(shí)際地址,并通過實(shí)際內(nèi)存地址得到模塊基址,對(duì)比全局表即可拿到當(dāng)前模塊是返回到了哪個(gè)模塊的。

if __name__ == "__main__":
    dbg = MyDebug()

    connect_flag = dbg.connect()
    print("連接狀態(tài): {}".format(connect_flag))

    # 得到程序加載過的所有模塊信息
    module_list = dbg.get_all_module()

    # 向下掃描堆棧
    for index in range(0,10):

        # 默認(rèn)返回有符號(hào)數(shù)
        stack_address = dbg.peek_stack(index)

        # 反匯編一行
        dasm = dbg.get_disasm_one_code(stack_address)

        # 根據(jù)地址得到模塊基址
        if stack_address <= 0:
            mod_base = 0
        else:
            mod_base = dbg.get_base_from_address(long_to_ulong(stack_address))

        # print("stack => [{}] addr = {:10} base = {:10} dasm = {}".format(index, hex(long_to_ulong(stack_address)),hex(mod_base), dasm))
        if mod_base > 0:
            for x in module_list:
                if mod_base == x.get("base"):
                    print("stack => [{}] addr = {:10} base = {:10} dasm = {:15} return = {:10}"
                          .format(index,hex(long_to_ulong(stack_address)),hex(mod_base), dasm,
                                  x.get("name")))

    dbg.close()

運(yùn)行如上代碼片段,則會(huì)輸出如下圖所示的堆棧返回位置;

4.8 x64dbg 學(xué)會(huì)掃描應(yīng)用堆棧文章來源地址http://www.zghlxwxcb.cn/news/detail-540957.html

到了這里,關(guān)于4.8 x64dbg 學(xué)會(huì)掃描應(yīng)用堆棧的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 1.1 熟悉x64dbg調(diào)試器

    1.1 熟悉x64dbg調(diào)試器

    x64dbg 是一款開源、免費(fèi)、功能強(qiáng)大的動(dòng)態(tài)反匯編調(diào)試器,它能夠在 Windows 平臺(tái)上進(jìn)行應(yīng)用程序的反匯編、調(diào)試和分析工作。與傳統(tǒng)的調(diào)試器如 Ollydbg 相比,x64dbg調(diào)試器的出現(xiàn)填補(bǔ)了 Ollydbg 等傳統(tǒng)調(diào)試器的不足,為反匯編調(diào)試工作提供了更高效、更可靠的解決方案。正是因?yàn)橛?/p>

    2024年02月12日
    瀏覽(20)
  • 4.5 x64dbg 探索鉤子劫持技術(shù)

    4.5 x64dbg 探索鉤子劫持技術(shù)

    鉤子劫持技術(shù)是計(jì)算機(jī)編程中的一種技術(shù),它們可以讓開發(fā)者攔截系統(tǒng)函數(shù)或應(yīng)用程序函數(shù)的調(diào)用,并在函數(shù)調(diào)用前或調(diào)用后執(zhí)行自定義代碼,鉤子劫持技術(shù)通常用于病毒和惡意軟件,也可以讓開發(fā)者擴(kuò)展或修改系統(tǒng)函數(shù)的功能,從而提高軟件的性能和增加新功能。 4.5.1 探索

    2024年02月13日
    瀏覽(16)
  • 4.9 x64dbg 內(nèi)存處理與差異對(duì)比

    4.9 x64dbg 內(nèi)存處理與差異對(duì)比

    LyScript 插件中針對(duì)內(nèi)存讀寫函數(shù)的封裝功能并不多,只提供了最基本的 內(nèi)存讀取 和 內(nèi)存寫入 系列函數(shù)的封裝,本章將繼續(xù)對(duì)API接口進(jìn)行封裝,實(shí)現(xiàn)一些在軟件逆向分析中非常實(shí)用的功能,例如ShellCode代碼寫出與置入,內(nèi)存交換,內(nèi)存區(qū)域?qū)Ρ?,磁盤與內(nèi)存鏡像比較,內(nèi)存特

    2024年02月16日
    瀏覽(25)
  • 4.3 x64dbg 搜索內(nèi)存可利用指令

    4.3 x64dbg 搜索內(nèi)存可利用指令

    發(fā)現(xiàn)漏洞的第一步則是需要尋找到可利用的反匯編指令片段,在某些時(shí)候遠(yuǎn)程緩沖區(qū)溢出需要通過類似于 jmp esp 等特定的反匯編指令實(shí)現(xiàn)跳轉(zhuǎn)功能,并以此來執(zhí)行布置好的 ShellCode 惡意代碼片段, LyScript 插件則可以很好的完成對(duì)當(dāng)前進(jìn)程內(nèi)存中特定函數(shù)的檢索工作。 一般而言

    2024年02月12日
    瀏覽(16)
  • 4.4 x64dbg 繞過反調(diào)試保護(hù)機(jī)制

    4.4 x64dbg 繞過反調(diào)試保護(hù)機(jī)制

    在Windows平臺(tái)下,應(yīng)用程序?yàn)榱吮Wo(hù)自己不被調(diào)試器調(diào)試會(huì)通過各種方法限制進(jìn)程調(diào)試自身,通常此類反調(diào)試技術(shù)會(huì)限制我們對(duì)其進(jìn)行軟件逆向與漏洞分析,下面是一些常見的反調(diào)試保護(hù)方法: IsDebuggerPresent:檢查當(dāng)前程序是否在調(diào)試器環(huán)境下運(yùn)行。 OutputDebugString:向調(diào)試器發(fā)

    2024年02月12日
    瀏覽(16)
  • 4.10 x64dbg 反匯編功能的封裝

    4.10 x64dbg 反匯編功能的封裝

    LyScript 插件提供的反匯編系列函數(shù)雖然能夠?qū)崿F(xiàn)基本的反匯編功能,但在實(shí)際使用中,可能會(huì)遇到一些更為復(fù)雜的需求,此時(shí)就需要根據(jù)自身需要進(jìn)行二次開發(fā),以實(shí)現(xiàn)更加高級(jí)的功能。本章將繼續(xù)深入探索反匯編功能,并將介紹如何實(shí)現(xiàn)反匯編代碼的檢索、獲取上下一條代

    2024年02月13日
    瀏覽(22)
  • OllyDbg 與 x64Dbg 與 Windbg 與 IDA 區(qū)別是什么?

    OllyDbg 與 x64Dbg 與 Windbg 與 IDA 區(qū)別是什么?

    OllyDbg 和 x64Dbg 大致屬于同一類別。它們的主要優(yōu)勢(shì)是在沒有符號(hào)信息的情況下進(jìn)行調(diào)試(盡管它們也可以使用符號(hào)信息進(jìn)行調(diào)試)。OllyDbg(封閉源代碼)已經(jīng)很久沒有維護(hù)了,并且僅限于 x86 32 位。另一方面,x64Dbg 被積極維護(hù),開源并且可以處理 x86 和 x64。兩者都支持插件

    2024年02月08日
    瀏覽(19)
  • LNK1112: 模塊計(jì)算機(jī)類型“x86”與目標(biāo)計(jì)算機(jī)類型“x64”沖突(VS2019)

    LNK1112: 模塊計(jì)算機(jī)類型“x86”與目標(biāo)計(jì)算機(jī)類型“x64”沖突(VS2019)

    剛裝好vs2019,創(chuàng)建一個(gè)簡(jiǎn)單的控制臺(tái)程序,輸出“Hello World!” ,x86下編譯鏈接沒有問題,但是平臺(tái)設(shè)為“x64\\\"后出現(xiàn)了標(biāo)題所說的錯(cuò)誤。 查閱網(wǎng)絡(luò),沒有正確的答案。 我試著分析這個(gè)錯(cuò)誤:是由于鏈接中的模塊編譯為“x86”的。剛才是以為鏈接庫(kù)中包含了x86類型的庫(kù)。但是

    2024年02月12日
    瀏覽(21)
  • 計(jì)算機(jī)組成原理知識(shí)——CPU結(jié)構(gòu)組成和功能、堆棧、RISC、

    2023.9.6 計(jì)組知識(shí)開始學(xué)習(xí) 中央處理單元 :簡(jiǎn)稱為CPU或處理器,功能是控制計(jì)算機(jī)的操作和處理數(shù)據(jù) 控制器 :控制計(jì)算機(jī)的操作,例如讀取指令、分析指令、時(shí)序、總線的控制等 運(yùn)算器 :完成數(shù)據(jù)處理功能 寄存器 :臨時(shí)存儲(chǔ)指令、地址、數(shù)據(jù)、計(jì)算結(jié)果等 中斷 3個(gè):取指

    2024年02月09日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包