1. 程式人生 > >任意程序添加ShellCode

任意程序添加ShellCode

適合新手 在哪裏 ebo char 哪裏 正常的 std 源代碼 window

  • 我先寫了一個小程序Test.exe(註意:由於我用的是控制臺程序沒有導入user32.dll所以我用的直接添加ShellCode是不行的,要麽在ShellCode中導入user32.dll要麽在程序中Load一下,如果沒有以下測試不成功)。
//Test.exe源代碼
#include <stdio.h> #include <windows.h> int main(int argc, char* argv[]) { LoadLibrary("kernel32.dll"); LoadLibrary("user32.dll"); MessageBox(NULL,
"http://cnblogs/ONDragon","ONDragon",0); printf("Test\n"); return 0; }
  • 用UE打開,添加我們要添加的ShellCode(彈出另一個MessageBox)。
push 0x0        6A 00
push 0x0        6A 00     
push 0x0        6A 00
push 0x0        6A 00
call 771BEA11   E8 XXXX
  • 解釋 call 771BEA11 這個地址是我本機MessageBox的地址,連地址都不會找,那麽先自己查查在學這個吧(還有後面的OEP查找什麽的),有寫小復雜對於新手。
  • E8 是Call的硬編碼,6A 00 是 push 0x00 的硬編碼。
  • 因為MessageBox需要4個參數,處於簡單化,我們就給它push4個0,只是簡單化。
  • 我們要做的就是在程序中添加這個硬編碼指令,那麽在哪裏添加呢?我們大概學過PE結構了,我們只要找到一個節的空白位置添加即可。

技術分享

  • 我們只要把上面的硬編碼添加到程序中即可,但是也不是直接添加的,需要一個轉換。
  • 要跳轉的地址 = E8下一條指令的地址 + XXXX。(E9同理,下面會遇到)!!!
  • XXXX = 要跳轉的地址 - E8下一條指令的地址。(E9同理,下面會遇到)!!!
  • 比如我們要跳轉的地址是MessageBox的地址771BEA11,我們不能直接寫E8(call)771BEA11,需要上公式轉換,要跳的地址就是(771BEA11) - E8的下一條指令的地址。
  • 例子:
  • 我們在文件偏移為5940的地址添加我們的ShellCode。
  • 6A 00 6A 00 6A 00 6A 00(註意大小端格式
  • XXXX(就是將要填入E8 後面的值) = 771BEA11 - 0040594D(E8的下一條指令的地址)。
  • 還要註意,一定是減去 0040594D,是內存地址RVA不是文件偏移。

技術分享

  • 但是程序運行起來不會自己跑到這個位置運行代碼,所以要讓程序自己打開時到這裏運行代碼,所以要修改OEP。

技術分享

  • 這樣程序就會跑到我們的ShellCode處執行我們的代碼,但是,為了不讓被發現程序被修改了,得讓它執行完我們的代碼後,再去正常執行自己的代碼,所以我們還要跳回去正常的入口OEP。

技術分享

  • 所以我們用E9(jmp 的硬編碼)程序執行完我們的代碼要無條件跳轉到正常入口OEP,所以XXXX = 正常OEP - E9下一條指令的地址 = 401071 - 405952 = FFFFB71F。
  • 然後保存運行即可,會先彈出我們的ShellCode。OK。

技術分享

  • 總結
  1. 註意不適合新手。
  2. 註意要仔細,要LoadLibrary("user32.dll");只針對控制臺程序。
  3. 註意大小端格式。
  4. 註意E8(E9)後面地址的轉換。
  5. 註意添加代碼地址是(內存中的地址)RVA。
  6. 還是學學PE才行。

任意程序添加ShellCode