shellcode 反彙編,模擬執行以及除錯方法
onlinedisassembler
https://onlinedisassembler.com 線上反彙編工具,類似於lda。功能比較單一。
Any.run 等平臺線上分析
- 將shellcode儲存為檔案
- 通過如下指令碼,轉換shellcode為char陣列
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)
- 將結果複製到char shellcode處,並 通過如下vs程式載入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
點選生成解決方案,將生成的exe上傳至Any.run去分析
如圖,即可通過線上分析平臺去分析shellcode。簡單快捷
槽點主要有如下幾方面:
- 一定要選擇靜態編譯c執行庫,因為Any.run 的執行庫可能會不全。以防萬一
- shellcode不可以是\xFF 這類形式,必須是0xFF。因為前者屬於字串,後者屬於陣列。待分析的shellcode較大,超過65535位元組後,vs在編譯時會報錯
fatal error C1091: compiler limit: string exceeds 65535 bytes in length
scdbg
windows shellcode執行模擬器,模擬執行shellcode
對於簡單的shellcode 推薦使用此方法,模擬執行找到c2地址
使用文章以及介紹
https://isc.sans.edu/forums/diary/Analyzing+Encoded+Shellcode+with+scdbg/24134
優點
- 支援debug shellcode
- dum記憶體
- 重定向tcp請求到其他機器,但是不支援urlopen等函式
缺點:
- 功能較為單一,模擬執行不是很全。有時候可能執行不到某些流程。並且沒有實現部分dll的匯出函式
圖片
下載連結
http://sandsprite.com/CodeStuff/scdbg.zip
miasm
miasm是一個python llvm寫的逆向工程框架。
但是官方中提供了很多例子,我們可以直接利用官方提供的指令碼去完成很多工
miasm不僅僅支援pe檔案,還支援elf等,支援x86,arm,mips等架構
miasm功能不僅僅侷限於這些,還有很多好玩的功能,例如自動化脫殼等。參考
- https://miasm.re/blog/index.html
- https://github.com/cea-sec/miasm/
miasm 反編譯shellcode
使用graphviz 載入got檔案,獲得如下
同理 arm的選擇arm,mips選擇mips處理器型別
如果不像使用官方自帶,可以自己寫
沙箱中執行shellcode
記錄每步執行的各種暫存器的值
沙箱中執行可執行系統檔案
在知道系統架構的情況下 可以選擇相應系統架構的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()
- hook沙箱中系統函式和peb等和資料結構
例如hook urlmon_URLDownloadToCacheFileW
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"
- 讀寫並修改系統可執行檔案
例如pe檔案的修改,新增.text區段,修改pe檔案結構等。當然,也支援elf,mach-o檔案的修改等
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))
思維擴充套件
- sandbox載入一個pe檔案
- 在pe檔案中申請一段記憶體,存放shellcode
- 修改eip到shellcode處
- 執行
好處,可以結合pe檔案自動分析,分析處該shellcode的具體行為
OD載入shellcode
方法一
需要安裝Olly Advanced 外掛
- 隨便load一個應用程式
- Alt+m 開啟記憶體頁面,新增記憶體,如圖
- 將shellcode複製進去
- 設定新的eip
方法二
該方法靈活應用
如圖我們可以看出,載入shellcode的方式有以下幾個步驟
- 呼叫virtualloc申請記憶體,屬性為可寫可執行。用來存放shellcode
呼叫createprocess 執行shellcode
注意,並不是一定通過createprocess去執行shellcode。也可以通過內聯彙編jmp,setThreadContext等方式去執行shellcode。理論上,只要可以修改eip,就可以執行shellcode
od中輸入命令 bp createprocess
等執行shellcode的時候,od會自動停在createprocess處,也就是shellcode開始執行的位置。如圖
相關推薦
shellcode 反彙編,模擬執行以及除錯方法
onlinedisassembler https://onlinedisassembler.com 線上反彙編工具,類似於lda。功能比較單一。 Any.run 等平臺線上分析 將shellcode儲存為檔案 通過如下指令碼,轉換shellcode為char陣列 import binascii fil
windows下使用vscode編寫執行以及除錯C/C++
內容會不定期更新。 一、vscode介紹 vscode是一個輕量的程式碼編輯器,本身是不帶有編譯器的,所以使用的時候要提前安裝好一個C/C++編譯器。肯定會有人拿vscode和sublime text去做一個比較,因為vscode已整合控制檯通過寫命令列的方式實現編譯執行程式,所
Node.js中exports,module.exports以及require方法
bubuko lan ref isp 沒有 right target img .html 在Node.js中,使用module.exports.f = ...與使用exports.f = ...是一樣的,此時exports就是module.exports的一種簡寫方式。但是
軟體安全測試考慮點,測試點以及測試方法整理之二
接著上一篇 軟體安全測試考慮點,測試點以及測試方法整理之一 2.輸入<input type=”text” name=”user” onclick="alert(1)"/>,看是否出現文字框; 3.輸入<script type=”text/javascript”>alert
軟體安全測試考慮點,測試點以及測試方法整理之一
軟體安全性測試主要包括程式、資料庫安全性測試。根據系統安全指標不同測試策略也不同。 使用者身份認證安全的測試要考慮問題: 1.明確區分系統中不同使用者許可權 2.系統中會不會出現使用者衝突 3.系統會不會因使用者的許可權的改變造成混亂 4.使用者登陸密碼是否是可見、可複製 5.系統的密碼策略,通
重新安裝VMware tool後,指令碼執行失敗解決方法
重新安裝前,一定要先將VMware tool去除掉 可以執行以下命令 sudo apt-get autoremove open-vm-tools 也可以執行這個命令(如果vmware-uninst
LBS——JS非同步事件,同步執行(Promise方法應用)
此方法主要解決,多條非同步事件,同步執行的問題 (如高德api 前臺糾偏方法500點限制問題) AMap.GraspRoad() 高德糾偏能座標糾偏至道路線上,但是方法座標引數限制在500個, 可用此方法解決點上限問題 /* <script type="text/javasc
oracle建立儲存過程常見錯誤以及除錯方法+
create or replace procedure testoutput is begin dbms_output.put_line('hello world! this is the first procedure'); end; / --編譯 create or
IOS常用延遲呼叫,後臺呼叫,主執行緒呼叫方法
/延遲呼叫 [selfperformSelector:@selector(doSomeThing:) withObject:nilafterDelay:1.0f]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int
一些VC的快捷鍵以及除錯方法技巧
原文地址:http://www.cppblog.com/kenbardy/articles/4188.html 1.檢測程式中的括號是否匹配 把游標移動到需要檢測的括號(如大括號{}、方括號[]、圓括號()和尖括號<>)前面,鍵入快捷鍵“Ctrl+]”
linux系統下出現coredump的情況以及除錯方法
什麼是coredump 通常情況下coredmp包括了程式執行時的記憶體,暫存器狀態,堆疊指標,記憶體管理資訊等。能夠理解為把程式工作的當前狀態儲存成一個檔案。很多程式和作業系統出錯時會自己主動生成一個core檔案。 怎樣使用coredump coredump能夠用在非
C++ 多執行緒除錯方法
最近有個程式用到了多執行緒,但是執行一段時間自動掛掉了,debug模式提示流錯誤,但是定位不到具體原因,利用各種方法查詢問題,利用日誌,分開部署等,都沒有找到根本原因,同事推薦了一個多執行緒的程式崩潰解決方法,C++記錄程式崩潰時的dumpfile,於是試了一下,問題解決。
程式執行時,建立一個額外的輸出臺,輸出程式內的Log以及除錯結果
需求描述:在做硬體除錯的時候,經常會需要用程式除錯具體問題處在哪裡,但是不斷重啟程式看日誌顯得繁瑣,想將日誌及除錯結果實時輸出。 解決方案:使用Kernel32.dll和user32.dll建立Console,使用控制檯實時輸出。在Main函式中新增實現程式碼
oracle 存儲過程參數介紹 in ,out , in out 以及 執行(二)
pre upd class under cati 查詢 ace proc oracl 存儲過程參數 1.IN DEFAULT (默認)2.OUT3.IN OUT 可修改 形參和實參-- 形參 1 CREATE PROCEDURE raise_sal(ID NUMBER
【轉】Linux中文件的可讀,可寫,可執行權限的解讀以及chmod,chown,chgrp命令的用法
bsp local 目標 訪問權限 rac group 情況下 有用 三種 chmod是更改文件的權限 chown是改改文件的屬主與屬組 chgrp只是更改文件的屬組。 一、文件權限解讀 如上圖所示,開頭的-rwxrw-r--這一字符串標識文件權限。
Android Smali反彙編分析與除錯
很多Android APK由於加密了(比如加了花指令), 無法反彙編為Java程式。此時只能檢視Smali原始碼, 用Smali原始碼進行除錯分析。 smali以及baksmali的jar包用法 baksmali下載:jar包下載地址 命令列:java -jar baksm
計算機中的原碼,反碼,補碼,以及他們在內存中的存儲形式。
加減法 判斷 組成 sig 等等 同時 解析 數字 技術分享 1.原碼 原碼就是早期用來表示數字的一種方式: 一個正數,轉換為二進制位就是這個正數的原碼。負數的絕對值轉換成二進制位然後在高位補1就是這個負數的原碼 舉例說明: int類型的 3
計算機中的原碼,反碼,補碼,以及他們在記憶體中的儲存形式。
1.原碼 原碼就是早期用來表示數字的一種方式: 一個正數,轉換為二進位制位就是這個正數的原碼。負數的絕對值轉換成二進位制位然後在高位補1就是這個負數的原碼 舉例說明: int型別的 3 的原碼是 11B(B表示二進位制位), 在32位機器上佔四個位元組,那麼高位補零就得:
使用IE控制元件來分析網頁結構,模擬測試爬蟲,使用scrapy+selenium來執行網頁爬蟲
通常我們使用scrapy來進行網頁內容的收集,但使用起來非常的不方便: 1. 需要使用工具,或者手動來計算得到網頁元素的xpath。 2. 對一些網頁內需要ajax的執行才顯示的內容處理起來並不方便。 我通過找相關的工具,研究爬蟲方案,找到了一個比較合適的工具軟體,和方便易用的處理流程:
pytorch中的上取樣以及各種反操作,求逆操作
import torch.nn.functional as F import torch.nn as nn F.upsample(input, size=None, scale_factor=None,mode='nearest', align