0

Windowsコマンドを実行するだけの簡単なアセンブリプログラムを書いています。以下に現在の作業コードを添付します。Kernel32.dll の関数である WinExec のベース アドレスをハード コードすると、コードが機能します。Arwin という別のプログラムを使用して、このアドレスを見つけました。ただし、Windows のメモリ保護アドレス空間レイアウトのランダム化 (ASLR) のため、再起動するとこれが中断されます。

私が探しているのは、次回の再起動時に変更されるメモリ アドレスをコードにハード コードすることなく、Windows シェル コマンドを実行する方法を見つけることです。私は似たようなコードを見つけましたが、私が理解している、または目的に合っているものは何もありません。これは C で記述できることはわかっていますが、特にアセンブラを使用してサイズをできるだけ小さくしています。

アドバイス/助けてくれてありがとう。

;Just runs a simple netstat command.
;compile with nasm -f bin cmd.asm -o cmd.bin

[BITS 32]

global _start

section .text

_start:
jmp short command        


function:                 ;Label 
;WinExec("Command to execute",NULL)
pop     ecx
xor     eax,eax
push    eax
push    ecx
mov     eax,0x77e6e5fd  ;Address found by arwin for WinExec in Kernel32.dll
call    eax

xor eax,eax
push    eax
mov eax,0x7c81cafa
call    eax

command:                  ;Label
call function
db "cmd.exe /c netstat /naob"
db 0x00
4

1 に答える 1

1

スタック内で必要なアクションを実行するために Windows API ハッシュを参照する方法を見つけたと言うだけの更新です。これにより、メモリ アドレスをハード コードする必要がなくなり、動的シェルコードを記述できるようになります。

これに対する防御策はありますが、パッチが適用されていない無数の旧式のマシンに対してはまだ機能します。

次の 2 つのサイトは、必要なものを見つけるのに役立ちました。

http://blog.harmonysecurity.com/2009_08_01_archive.html

https://www.scriptjunkie.us/2010/03/shellcode-api-hashes/

于 2016-04-21T03:17:44.343 に答える