https://onlinedisassembler.com 在線反彙編工具,相似於lda。功能比較單一。
html
import binascii filename = "C:\\Users\\liang\\Desktop\\工做相關\\樣本\\rdpscan\\rdpscan\\ssleay32.dll" #filename = "C:\\Users\\liang\\Desktop\\payload" shellcode = "{" ctr = 1 maxlen = 15 for b in open(filename, "rb").read(): shellcode += "0x" + str(binascii.hexlify(b.to_bytes(length=1, byteorder='big')))[2:4] + "," if ctr == maxlen: shellcode += "\n" ctr = 0 ctr += 1 shellcode = shellcode[:-1] + "}" print(shellcode)
#include <windows.h> #include <stdio.h> #include <string.h> #pragma comment(linker, "/section:.data,RWE") unsigned char shellcode[] = 複製到這裏 typedef void(__stdcall* CODE) (); int main() { PVOID p = NULL; if ((p = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL) MessageBoxA(NULL, "申請內存失敗", "提醒", MB_OK); if (!(memcpy(p, shellcode, sizeof(shellcode)))) MessageBoxA(NULL, "寫內存失敗", "提醒", MB_OK); CODE code = (CODE)p; code(); return 0; }
設置c運行庫的靜態編譯,如圖設置,將運行庫設置爲多線程/MT
python
點擊生成解決方案,將生成的exe上傳至Any.run去分析
如圖,便可經過在線分析平臺去分析shellcode。簡單快捷
git
槽點主要有以下幾方面:github
fatal error C1091: compiler limit: string exceeds 65535 bytes in length
windows shellcode運行模擬器,模擬運行shellcode
對於簡單的shellcode 推薦使用此方法,模擬運行找到c2地址shell
使用文章以及介紹windows
https://isc.sans.edu/forums/diary/Analyzing+Encoded+Shellcode+with+scdbg/24134api
優勢數組
缺點:sass
圖片
數據結構
下載連接
http://sandsprite.com/CodeStuff/scdbg.zip
miasm是一個python llvm寫的逆向工程框架。
可是官方中提供了不少例子,咱們能夠直接利用官方提供的腳本去完成不少任務
miasm不單單支持pe文件,還支持elf等,支持x86,arm,mips等架構
miasm功能不單單侷限於這些,還有不少好玩的功能,例如自動化脫殼等。參考
使用graphviz 加載got文件,得到以下
同理 arm的選擇arm,mips選擇mips處理器類型
若是不像使用官方自帶,能夠本身寫
記錄每步運行的各類寄存器的值
在知道系統架構的狀況下 能夠選擇相應系統架構的sandbox,運行shellcode,從而得到更多信息
能夠支持自寫dll,方便hook,如圖,可是我沒寫
支持的系統架構以下
# A breakpoint callback takes the jitter as first parameterdef dump(jitter): # Dump data ad address run_addr with a length of len(data) new_data = jitter.vm.get_mem(run_addr, len(data)) # Save to disk open('/tmp/dump.bin', 'wb').write(new_data) # Stop execution return False # Register a callback to the breakpointmyjit.add_breakpoint(0x4000004b, dump)...myjit.cpu.EAX = 0x40000000myjit.init_run(run_addr)myjit.continue_run()
def urlmon_URLDownloadToCacheFileW(jitter): ret_ad, args = jitter.func_args_stdcall(["lpunkcaller", "szurl", "szfilename", "ccfilename", "reserved", "pbsc"]) url = jitter.get_str_unic(args.szurl) print "URL:", url jitter.set_str_unic(args.szfilename, "toto") jitter.func_ret_stdcall(ret_ad, 0)
注意 有時候程序調用沙箱沒有實現的api,則須要經過上述該方法本身實現一個
sandbox 默認只實現瞭如下幾個dll的導出函數 ntdll.dll", "kernel32.dll", "user32.dll",
"ole32.dll", "urlmon.dll",
"ws2_32.dll", 'advapi32.dll', "psapi.dll"
import sys from elfesteem import pe_init # Get the shellcode data = open(sys.argv[1]).read() # Generate a PE pe = pe_init.PE(wsize=32) # Add a ".text" section containing the shellcode to the PE s_text = pe.SHList.add_section(name=".text", addr=0x1000, data=data) # Set the entrypoint to the shellcode's address pe.Opthdr.AddressOfEntryPoint = s_text.addr # Write the PE to "sc_pe.py" open('sc_pe.exe', 'w').write(str(pe))
好處,能夠結合pe文件自動分析,分析處該shellcode的具體行爲
須要安裝Olly Advanced 插件
該方法靈活應用
如圖咱們能夠看出,加載shellcode的方式有如下幾個步驟
調用createprocess 執行shellcode
注意,並非必定經過createprocess去執行shellcode。也能夠經過內聯彙編jmp,setThreadContext等方式去執行shellcode。理論上,只要能夠修改eip,就能夠執行shellcode
od中輸入命令 bp createprocess
等運行shellcode的時候,od會自動停在createprocess處,也就是shellcode開始執行的位置。如圖