日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ShellCode的编写入门

發布時間:2025/4/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ShellCode的编写入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上次學習了下堆噴漏洞的原理,雖說之前有學習過緩沖區溢出的原理,但還沒了解過堆噴這個概念,于是趁此機會學習了,順便復習了緩沖區溢出這塊知識,之前由于各種原因對Shellcode的編寫只是了解個大概,并沒有真正動手寫過一個Shellcode。眼前遇到個堆噴漏洞找Shellcode時就下決定自己寫個Shellcode,考慮到時間和精力的有限就寫個計算器簡單的練練手。

注:以下在XP SP3+VC6.0編譯成功

一、首先寫個簡單的調用計算器的程序。

  • 注:以下在XP SP3+VC6.0編譯成功

    一、首先寫個簡單的調用計算器的程序。

  • #include?"windows.h"
  • int?main()
  • {
  • ????LoadLibraryA("kernel32.dll");//4c801d7b
  • ????WinExec("calc.exe",SW_SHOW);????
  • ????return 0;
  • }
  • ? ? 二、將WinExec("calc.exe",SW_SHOW);轉化為匯編模樣。

    ? ? 在WinExec("calc.exe",SW_SHOW);處下斷點,點F5進行調試,運行到此處時程序會暫停下來,程序暫停后按Alt+8即可查看到對應的匯編代碼,經整理后如下:

    點擊(此處)折疊或打開

  • #include?"windows.h"
  • int?main()
  • {
  • ????LoadLibraryA("kernel32.dll");//4c801d7b
  • ????WinExec("calc.exe",SW_SHOW);?
  • ????__asm{
  • ????mov esi,esp
  • ????push 5
  • ????push offset?string?"calc.exe"?(0042201c)
  • ????call?dword ptr?[__imp__WinExec@8?(0042a14c)]
  • ????cmp esi,esp
  • ????call?__chkesp?(00401090)
  • ????}
  • ????return 0;
  • }
  • ?

    ? ? 稍微懂那么一丟丟匯編的童鞋都知道0042a14c處放著WinExec的地址,這里要注意WinExec的地址不是現在看到的0042a14c,要在地址為0042a14c放著的東東才是WinExec的地址。打個比方0042a14c是個指針,指針所指的地方才是真正需要的東東,所以我們要取出地址為0042a14c存放的數據。在VC6.0下按Alt+6可調出內存窗口,輸入0042a14c即可看到。

  • 因此WinExec真正的地址是7C8623AD,注意,這里是要反過來讀取。

    ?

    ? ? 三、現在有了匯編模樣的語句和WinExec的地址,接下來就是要轉化為具有Shellcode的匯編代碼。在轉化匯編時先了解匯編下面是如何完成一個函數調用的:

    ????? ? 1、父函數將函數的實參按照從右至左順序壓入堆棧;

    ????? ? 2、CPU將父函數中函數調用指令Call XXXXXXXX的下一條指令地址EIP壓入堆棧;

    ????? ? 3、父函數通過Push Ebp將基地指針Ebp值東方鉭業堆棧,并通過Mov Ebp,Esp指令將當前堆棧指針Esp值傳給Ebp;

    ????? ? 4、通過Sub Esp,m(m是字節數)指令可以為存放函數中的局部變量開辟內存。函數在執行的時候如果需要訪問實參或局部變量,都可以通過EBP指針來指引完成。

    ?

    ????? ? 根據匯編調用函數特點,并使用壓棧的方法將參數傳遞進行,便可得到如下代碼:

    ?

    點擊(此處)折疊或打開

  • #include?"windows.h"
  • int?main()
  • {
  • ? ? LoadLibraryA("kernel32.dll");//4c801d7b
  • ????//WinExec("calc.exe",SW_SHOW);
  • ????
  • ????__asm
  • ????{
  • ????????push????ebp;
  • ????????mov????????ebp,esp;
  • ????????xor?eax,eax;
  • ????????push eax;
  • ????????sub?esp,08h;
  • ????????mov byte ptr?[ebp-0Ch],63h;?//c
  • ????????mov byte ptr?[ebp-0Bh],61h;?//a
  • ????????mov byte ptr?[ebp-0Ah],6Ch;?//l
  • ????????mov byte ptr?[ebp-09h],63h;?//c
  • ????????mov byte ptr?[ebp-08h],2Eh;?//.
  • ????????mov byte ptr?[ebp-07h],65h;?//e
  • ????????mov byte ptr?[ebp-06h],78h;?//x
  • ????????mov byte ptr?[ebp-05h],65h;?//e
  • ????????lea eax,[ebp-0ch];
  • ????????push eax;????????????????????//將calc.exe壓入棧內
  • ????????mov????????eax,0x7C8623AD;
  • ????????call????eax;????????????????????//調用WinExec
  • ????????mov esp,ebp;
  • ????????pop????ebp;
  • ????}
  • ????return 0;
  • }

  • ? ? 注意,字符串要以00H結束的哦,編譯運行OK~~

    ?

    ? ??

    ? ? 四、到這里已經完成最難的部分了,接下來的工作即是將匯編在內存中的代碼,即是Shellcode拷出來就是了。同樣,在匯編代碼任意一處下斷點,讓程序在斷點處停下來,按Alt+8即可看到程序所在的內存地址,再按Alt+6調出內存窗口即可。

  • 將匯編代碼范圍內的東東全拷出來即得到傳說中的Shellcode,這就是程序運行在內存中的模樣了。一翻苦工后即可得到有Shellcode模樣的Shellcode,同理將LoadLibraryA同樣進行轉化即可得到一個完整的Shellcode。

    ????

    點擊(此處)折疊或打開

  • //LoadLibraryA("kernel32.dll");
  • //WinExec("calc.exe",SW_SHOW);
  • #include?"windows.h"
  • unsigned char shellcode[]=
  • "x55x8BxECx33xC0x50x83"
  • "xECx09xC6x45xF3x6BxC6"
  • "x45xF4x65xC6x45xF5x72"
  • "xC6x45xF6x6ExC6x45xF7"
  • "x65xC6x45xF8x6CxC6x45"
  • "xF9x33xC6x45xFAx32xC6"
  • "x45xFBx2ExC6x45xFCx64"
  • "xC6x45xFDx6CxC6x45xFE"
  • "x6Cx8Dx45xF3x50xB8x7B"
  • "x1Dx80x7CxFFxD0x8BxE5"
  • "x33xC0x50x83xECx08xC6"
  • "x45xF4x63xC6x45xF5x61"
  • "xC6x45xF6x6CxC6x45xF7"
  • "x63xC6x45xF8x2ExC6x45"
  • "xF9x65xC6x45xFAx78xC6"
  • "x45xFBx65x8Dx45xF4x50"
  • "xB8xADx23x86x7CxFFxD0"
  • "x8BxE5x5D";
  • main()
  • {
  • ????__asm
  • ????{
  • ????????lea ? ? eax,shellcode;
  • ????????call????eax;
  • ????}
  • }
  • 轉載于:https://www.cnblogs.com/milantgh/p/3616745.html

    總結

    以上是生活随笔為你收集整理的ShellCode的编写入门的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。