軟體漏洞分析入門(四)初級棧溢出C_修改程序流程

2021-02-07 看雪學院

To be the apostrophe which changed 「Impossible」 into 「I'm possible」                                 —— failwest

沒有星星的夜裡,我用知識吸引你

上節課沒有操練滴東西,不少蠢蠢欲動的同學肯定已經坐不住了。悟空,不要猴急,下面的兩堂課都是實踐課,用來在實踐中深入體會上節課中的知識,並且很有趣味性哦

信息安全技術是一個對技術性要求極高的領域,除了紮實的計算機理論基礎外、更重要的是優秀的動手實踐能力。在我看來,不懂二進位就無從談起安全技術。

緩衝區溢出的概念我若干年前已經瞭然於胸,不就是淹個返回地址把 CPU 指到緩衝區的 shellcode 去麼。然而當我開始動手實踐的時候,才發現實際中的情況遠遠比原理複雜。


國內近年來對網絡安全的重視程度正在逐漸增加,許多高校相繼成立了「信息安全學院」或者設立「網絡安全專業」。科班出身的學生往往具有紮實的理論基礎,他們通曉密碼學知識、知道 PKI 體系架構,但要談到如何真刀實槍的分析病毒樣本、如何拿掉 PE 上複雜的保護殼、如何在二進位文件中定位漏洞、如何對軟體實施有效的攻擊測試……能夠做到的人並不多。

雖然每年有大量的網絡安全技術人才從高校湧入人力市場,真正能夠滿足用人單位需求的卻聊聊無幾。捧著書本去做應急響應和風險評估是濫竽充數的作法,社會需要的是能夠為客戶切實解決安全風險的技術精英,而不是滿腹教條的闊論者。

我所知道的很多資深安全專家都並非科班出身,他們有的學醫、有的學文、有的根本沒有學歷和文憑,但他們卻技術精湛,充滿自信。

這個行業屬於有興趣、夠執著的人,屬於為了夢想能夠不懈努力的意志堅定者。如果你是這樣的人,請跟著我把這個系列的所有實驗全部完成,之後你會發現眼中的軟體,程序,語言,計算機都與以前看到的有所不同——因為以前使用肉眼來看問題,我會教你用心和調試器以及手指來重新體驗它們。

首先簡單複習上節課的內容:

高級語言經過編譯後,最終函數調用通過為其開闢棧幀來實現

開闢棧幀的動作是編譯器加進去的,高級語言程式設計師不用在意

函數棧幀中首先是函數的局部變量,局部變量後面存放著函數返回地址

當前被調用的子函數返回時,會從它的棧幀底部取出返回地址,並跳轉到那個位置(母函數中)繼續執行母函數

我們這節課的思路是,讓溢出數組的數據躍過 authenticated,一直淹沒到返回地址,把這個地址從 main 函數中分支判斷的地方直接改到密碼驗證通過的分支!

這樣當 verify_password 函數返回時,就會返回到錯誤的指令區去執行(密碼驗證通過的地方)

由於用鍵盤輸入字符的ASCII表示範圍有限,很多值如0x11,0x12等符號無法直接用鍵盤輸入,所以我們把用於實驗的代碼在第二講的基礎上稍加改動,將程序的輸入由鍵盤改為從文件中讀取字符串。


#include <stdio.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
  int authenticated;
  char buffer[8];
  authenticated=strcmp(password,PASSWORD);
  strcpy(buffer,password);//over flowed here!  
  return authenticated;
}
main()
{
  int valid_flag=0;
  char password[1024];
  FILE * fp;
  if(!(fp=fopen("password.txt","rw+")))
  {
    exit(0);
  }
  fscanf(fp,"%s",password);
  valid_flag = verify_password(password);
  if(valid_flag)
  {
    printf("incorrect password!\n");
  }
  else
  {
    printf("Congratulation! You have passed the verification!\n");
  }
  fclose(fp);
}


程序的基本邏輯和第二講中的代碼大體相同,只是現在將從同目錄下的password.txt 文件中讀取字符串而不是用鍵盤輸入。我們可以用十六進位的編輯器把我們想寫入的但不能直接鍵入的 ASCII 字符寫進這個 password.txt 文件。
  
用 VC6.0 將上述代碼編譯連結。我這裡使用默認編譯選項,BUILD 成 debug 版本。鑑於有些同學反映自己的用的是 VS2003 和 VS2005,我好人做到底,把我 build 出來的 PE 一併在附件中雙手奉上——沒話說了吧!不許不學,不許學不會,不許說難,不許不做實驗!呵呵。

要 PE 的點擊左下角閱讀原文查看、下載。

在與 PE 文件同目錄下建立 password.txt 並寫入測試用的密碼之後,就可以用OllyDbg 加載調試了。

停~~~啥是OllyDbg,開玩笑,在這裡問啥是 Ollydbg 分明是不給看雪老大的面子麼!如果沒有這個調試器的話,去工具版找吧,帖子附件要掛出個 OD 的話會給被人鄙視的。

在開始動手之前,我們先理理思路,看看要達到實驗目的我們都需要做哪些工作。

要摸清楚棧中的狀況,如函數地址距離緩衝區的偏移量,到底第幾個字節能淹到返回地址等。這雖然可以通過分析代碼得到,但我還是推薦從動態調試中獲得這些信息。


要得到程序中密碼驗證通過的指令地址,以便程序直接跳去這個分支執行


要在 password.txt 文件的相應偏移處填上這個地址

這樣 verify_password 函數返回後就會直接跳轉到驗證通過的正確分支去執行了。

首先用 OllyDbg 加載得到的可執行 PE 文件如圖:

相關焦點

  • 軟體漏洞分析入門__初級棧溢出C_修改程序流程
    這雖然可以通過分析代碼得到,但我還是推薦從動態調試中獲得這些信息。  要得到程序中密碼驗證通過的指令地址,以便程序直接跳去這個分支執行要在password.txt文件的相應偏移處填上這個地址  這樣verify_password函數返回後就會直接跳轉到驗證通過的正確分支去執行了。
  • 棧溢出漏洞原理詳解與利用
    0x01 前言和我一樣,有一些計算機專業的同學可能一直都在不停地碼代碼,卻很少關注程序是怎麼執行的,也不會考慮到自己寫的代碼是否會存在棧溢出漏洞,藉此機會我們一起走進棧溢出。0x02 程序是怎麼運行的在了解棧溢出之前我們先了解一下程序執行過程程序的執行過程可看作連續的函數調用。
  • dir-645 超長cookie棧溢出漏洞分析
    本文為看雪論精華文章看雪論壇作者ID:pureGavin分析一個D-Link的漏洞學習一下路由器漏洞方面的知識
  • 灰帽黑客進階秘籍之一——Linux棧溢出入門實戰篇
    本篇文章為入門篇故僅提供了8個level的棧溢出練習實驗,均未開啟任何保護的。後面的文章會進一步升級。 開始實驗本次實驗環境分別為 level0-level7 均提供了源碼和編譯好的程序level0我們先查看一下c源碼:
  • 讀書筆記——典型FTP軟體的模糊測試和漏洞利用
    材料一:《滲透測試完全初學者指南》中有關 War-FTP 1.65 的內容1.1 概述背景描述:在該書的第17、18章中,編寫了一個基於棧溢出和 SEH 機制的漏洞利用程序,使用 Python 以 TCP socket 的方式連接 FTP 軟體,用工具ImmunityDebugger
  • CTF必備技能丨Linux Pwn入門教程——格式化字符串漏洞
    教程僅針對i386/amd64下的Linux Pwn常見的Pwn手法,如棧,堆,整數溢出,格式化字符串,條件競爭等進行介紹,所有環境都會封裝在Docker鏡像當中,並提供調試用的教學程序,來自歷年賽事的原題和帶有注釋的python腳本。今天i春秋與大家分享的是Linux Pwn入門教程第七章:格式化字符串漏洞,閱讀用時約12分鐘。
  • IoT上的緩衝區溢出漏洞
    編譯器在程序中使用元數據來分配適當的緩衝區大小,但是這個元數據通常在構建時被丟棄了。如果在程序內或程序之間傳輸的數據隨後超出原定義的緩衝區大小,則數據信息將覆蓋相鄰的內存。這會導致內存訪問錯誤或崩潰,以及安全漏洞。緩衝區溢出和漏洞利用黑客可以使用堆棧緩衝區溢出替換帶有惡意代碼的可執行文件,這樣他們就可以利用系統資源,比如堆內存或者調用堆棧的本身。
  • 緩衝區溢出攻擊初學者手冊(更新版)
    /blahtest <- user inputËËËËËËËËËËË,testtest <- user inputtest我們在這裡使用這個程序運行了兩次這個函數。如果有溢出存在,函數的返回值地址是可以變的,從而改變程序的執行線程。
  • 32位以及64位棧遷移的具體分析與學習
    我們可利用該技巧來解決棧溢出空間大小不足的問題。這裡有個 很好的描述,建議大家可以去看下:留言或私信獲取連結32位程序 棧遷移這裡我拿 HITCON-Training-master 中的lab 6進行超詳細的分析,希望能給在學這個內容的興趣者們提供幫助!
  • 【原創】WannaCry勒索軟體中「永恆之藍」漏洞利用分析
    WannaCry 勒索軟體中,利用了 NSA 洩露工具中的「永恆之藍」漏洞,關於這個漏洞,之前已經有一些分析,在我看的文章中,http://blogs
  • 提權篇:溢出漏洞 EXP提權 教程
    5、3389埠:遠程管理埠只需要用「IP:埠號」就可以直接訪問了,默認埠3389本地實驗一:「溢出漏洞提權」我通過前面所分享的內容,上傳了一個ASP大馬。只需要直接訪問這個大馬就可以做很多的事情!
  • linux pwn入門學習到放棄
    本文記錄菜鳥學習linux pwn入門的一些過程,詳細介紹linux上的保護機制,分析一些常見漏洞如棧溢出,堆溢出,use after free等,以及一些常見工具集合介紹等。先來學習一些關於linux方面的保護措施,作業系統提供了許多安全機制來嘗試降低或阻止緩衝區溢出攻擊帶來的安全風險,包括DEP、ASLR等。
  • Windows漏洞利用開發 - 第1部分:基礎知識
    本系列文章是查找和利用Windows應用程式漏洞,希望那些沒有太多技術知識的安全和IT專業人員會對軟體安全感興趣並將其技能使私人和公共領域的軟體更安全。免責聲明:如果你是一個想要參與非法或不道德行為的人,你可以不用看了。
  • Office系列漏洞經典案例分析與利用
    3、漏洞定位由於緩衝區溢出函數處於EQNEDT32進程中,所以對它進行調試分析,打開漏洞文件會彈出計算器,一般採用Winexec函數調用,可對該函數進行下斷,然後進行逆推找出溢出點。點擊在4115A7函數上下好斷點,重新打開漏洞文件,斷下後進行步過(F8)分析,在步過第一個call後並沒有返回,而是直接彈出了計算器,這就說明漏洞溢出點在這個call裡面,也就是把棧中返回地址
  • 四道題看格串新的利用方式
    即輸入一個數以及一個9位元組的格式化字符串,從而使上述輸入的數與v3的值相同。其中v3的值為隨機數:該程序中用到了__printf_chk函數,該函數與printf的區別在於:__printf_chk調用過程中有一個的buffered_vfprintf函數,相應漏洞內容如下:
  • CTF必備技能丨Linux Pwn入門教程——調整棧幀的技巧
    在存在棧溢出的程序中,有時候我們會碰到一些棧相關的問題,例如溢出的字節數太小,ASLR導致的棧地址不可預測等。針對這些問題,我們有時候需要通過gadgets調整棧幀以完成攻擊。常用的思路包括加減esp值,利用部分溢出字節修改ebp值並進行stack pivot等。今天i春秋與大家分享的是Linux Pwn入門教程第五章:調整棧幀的技巧,閱讀用時約12分鐘。
  • 小議緩衝區溢出
    ; } return 0;}我把問題也寫出來,問題有三個:(1)分析是哪種溢出類型(2)給出題目的變量 apple 的地址,例如 0x0012ff44,給出 buf 各字符的地址(3)a、b、c、d 的 ASCII 碼值分別為0x61、0x62、0x63 和 0x64 ,給出 buf 輸入方式,使得程序可以輸出 hello
  • 堆入門之常見漏洞利用
    WP:這種漏洞在ubuntu18的環境下似乎無法實現洩露地址,下面的過程在ubuntu16.04的環境下進行:首先在ida中分析程序,主要功能有:add,list,show,remove,其中發現remove函數中的set_null函數是一個空函數,即程序存在UAF漏洞,看到有show函數,滿足洩露main_arena地址的條件。
  • C語言程序設計入門學習六步曲(菜鳥福利哦!)
    發生這種現象的原因有三個:一、所謂的看懂聽明白,只是很膚淺的語法知識,而我們編寫的程序或軟體是要根據要解決問題的實際需要控制程序的流程,如果你沒有深刻地理解C語言的語句的執行過程(或流程),你怎麼會編寫程序解決這些實際問題呢?二、用C語言編程解決實際問題,所需要的不僅僅是C語言的編程知識,還需要相關的專業知識。