緩衝區溢出實戰教程系列(二):dev c++編譯彙編代碼

小夥伴們對我上一篇文章的反應徹底出乎了個人意料,感謝你們對個人支持和承認。接下來我會精心的把這一系列課程設計好,儘可能詳細的展現給你們。上篇文章我列舉了一個緩衝區溢出的小例子,並提到了dev c++、ollydbg、IDA Freeware這三款軟件,並介紹了dev c++的基本用法。今天會補充一下Dev c++的用法。html

今天補充的用法主要是爲了之後編寫shellcode作準備,這篇文章只講用法,你們沒必要深究代碼的功能。c++

0×00 如何編寫彙編代碼

下面給你們一個在dev下用匯編代碼編譯的MessageBox的的代碼例子,能夠彈出一個提示框,今天仍是不講代碼,主要講代碼是如何編譯的。shell

 

#include<windows.h> int main() { LoadLibrary("user32.dll"); __asm__("push 0x00000001"); //MessageBoxA的最後一個參數 入棧 __asm__("mov byte ptr [ebp+0x26],0x57"); //W __asm__("mov byte ptr [ebp+0x27],0x61"); //a __asm__("mov byte ptr [ebp+0x28],0x72"); //r __asm__("mov byte ptr [ebp+0x29],0x6e"); //n __asm__("mov byte ptr [ebp+0x2a],0x69"); //i __asm__("mov byte ptr [ebp+0x2b],0x6e"); //n __asm__("mov byte ptr [ebp+0x2c],0x67"); //g __asm__("mov byte ptr [ebp+0x2d],0x00"); //表示字符截斷,就是說代碼截止 __asm__("lea eax,[ebp+0x26]"); //把存儲字符的起始地址賦給寄存器eax __asm__("push eax"); //把第三個參數入棧也就是標題 __asm__("mov byte ptr [ebp+0x2e],0x61"); __asm__("mov byte ptr [ebp+0x2f],0x62"); __asm__("mov byte ptr [ebp+0x30],0x63"); __asm__("mov byte ptr [ebp+0x31],0x64"); __asm__("lea eax,[ebp+0x2e]"); __asm__("push eax"); //把第二個參數入棧,也就是內容 __asm__("push 0x00000000"); //MessageBoxA的第一個參數 入棧 __asm__("mov eax,0x762cfdae"); //這個地址是臨時搜的MessageBox的地址 ,你們目前須要本身找。 __asm__("call eax"); return 0; } 

首先要編寫彙編代碼,咱們要用__asm__()或__asm()方法包含起來,不要忘記還要用雙引號。固然你要是以爲上面一行代碼用一個__asm__()函數麻煩,你也能夠在在一個函數裏編寫全部代碼,像下面這樣。不過要注意每行代碼都要用雙引號包裹,還要注意彙編代碼後邊的分號也要有哦。編程

__asm( "mov byte ptr [ebp+0x26],0x57;" "mov byte ptr [ebp+0x27],0x61;" ); //W、a 

0×01 如何編譯彙編代碼

我用的是intel風格的彙編,在dev下編譯一般會遇到問題,向下面這樣報不少錯誤。windows

解決方法其實很簡單就是,在編譯選項里加一個-masm=intel命令就好,具體步驟,是點擊工具-編譯選項,在彈出菜單中勾選「編譯時加入如下命令」,把-masm=intel命令添加進去就好,以下圖所示:sass

當咱們再編譯時就沒有問題了。ide

0×02 看看彙編代碼寫出來MessageBox的效果

4.png

這裏給你們跑出一個小問題,你們說說爲何abcd後面會出現「燙燙燙燙」的字樣,你們認真思考哈。函數

0×03 intel與AT&T的不一樣

由於上面提到了intel彙編,感受有必要提一下AT&T彙編,AT&T風格彙編在dev下是直接可編譯的,若是你熟悉這種彙編風格,那麼恭喜你。工具

彙編語言(英語:assembly language)是一種用於電子計算機、 微處理器、微控制器,或別樣可編程器件個低級語言。拉弗同個設備中,彙編語言對應着弗同個機器語言指令集。spa

彙編風格

x86/amd64彙編指令的兩大風格分別是Intel彙編與AT&T彙編,分別被Microsoft Windows/ Visual C++與GNU/Gas採用(Gas也可以使用Intel彙編風格):

你們看圖片直觀感覺一下就好。

5.png

6.png

0×04 將彙編代碼轉換成16進制機器碼

學會了這步咱們就能夠提取shellcode了。

首先,要設置一個斷點位置隨意,能夠在想設置斷點的地方單擊鼠標左鍵,也能夠把光標移動到想要設置的行按F4鍵:7.png

其次,依次點擊如圖的調試。8.png

這時候咱們點擊查看cpu窗口會看到彙編代碼,但不是咱們想要的:

9.png

咱們找到右下角的窗口看到發送命令到gdb,輸入disassemble /r 就會獲得16進制代碼與彙編代碼對應的結果。16進制代碼就是咱們想要的shellcode。

看我用紅框標註的位置:

10.png

 

原本是想把三個軟件所有講了,結果一補充就寫了這麼多。爲了你們方便查看仍是保持每篇有必定的獨立性吧,你們別嫌煩,俗話說磨刀不誤砍柴工。以上就是今天的內容,我們下期見

相關文章
相關標籤/搜索