1. 程式人生 > >shellcode 反彙編,模擬執行以及除錯方法

shellcode 反彙編,模擬執行以及除錯方法

onlinedisassembler

https://onlinedisassembler.com 線上反彙編工具,類似於lda。功能比較單一。

Any.run 等平臺線上分析

  1. 將shellcode儲存為檔案
  2. 通過如下指令碼,轉換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)
  1. 將結果複製到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;
}
  1. 設定c執行庫的靜態編譯,如圖設定,將執行庫設定為多執行緒/MT

  2. 點選生成解決方案,將生成的exe上傳至Any.run去分析
    如圖,即可通過線上分析平臺去分析shellcode。簡單快捷

槽點主要有如下幾方面:

  1. 一定要選擇靜態編譯c執行庫,因為Any.run 的執行庫可能會不全。以防萬一
  2. 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

優點

  1. 支援debug shellcode
  2. dum記憶體
  3. 重定向tcp請求到其他機器,但是不支援urlopen等函式

缺點:

  1. 功能較為單一,模擬執行不是很全。有時候可能執行不到某些流程。並且沒有實現部分dll的匯出函式

圖片

下載連結
http://sandsprite.com/CodeStuff/scdbg.zip

miasm

miasm是一個python llvm寫的逆向工程框架。

但是官方中提供了很多例子,我們可以直接利用官方提供的指令碼去完成很多工

miasm不僅僅支援pe檔案,還支援elf等,支援x86,arm,mips等架構

miasm功能不僅僅侷限於這些,還有很多好玩的功能,例如自動化脫殼等。參考

  1. https://miasm.re/blog/index.html
  2. https://github.com/cea-sec/miasm/

miasm 反編譯shellcode

使用graphviz 載入got檔案,獲得如下

同理 arm的選擇arm,mips選擇mips處理器型別

如果不像使用官方自帶,可以自己寫

沙箱中執行shellcode

記錄每步執行的各種暫存器的值

沙箱中執行可執行系統檔案

在知道系統架構的情況下 可以選擇相應系統架構的sandbox,執行shellcode,從而獲得更多資訊

可以支援自寫dll,方便hook,如圖,但是我沒寫

支援的系統架構如下

其他功能

  1. 新增斷點
    # 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()
    
  1. 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"

  1. 讀寫並修改系統可執行檔案
    例如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))
思維擴充套件
  1. sandbox載入一個pe檔案
  2. 在pe檔案中申請一段記憶體,存放shellcode
  3. 修改eip到shellcode處
  4. 執行

好處,可以結合pe檔案自動分析,分析處該shellcode的具體行為

OD載入shellcode

方法一

需要安裝Olly Advanced 外掛

  1. 隨便load一個應用程式
  2. Alt+m 開啟記憶體頁面,新增記憶體,如圖
  3. 將shellcode複製進去
  4. 設定新的eip

方法二

該方法靈活應用

如圖我們可以看出,載入shellcode的方式有以下幾個步驟

  1. 呼叫virtualloc申請記憶體,屬性為可寫可執行。用來存放shellcode
  2. 呼叫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中exportsmodule.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