說明 :
筆者整理了一些 shellcode 以及一些有漏洞的程序 , 需要學習的小伙伴如果有興趣可以參考一下
項目地址 : https://git.coding.net/yihangwang/pwnme.git
1. 清空通用寄存器 eax
;=========================================
; 方案一
;=========================================
mov eax,0 ; 直接移動
;=========================================
; 方案二
;=========================================
xor eax,eax ; 異或
;=========================================
; 方案三
;=========================================
shr eax,8 ; 右移 8 位
;=========================================
; 方案四
;=========================================
and eax, 0
;=========================================
; 方案五
;=========================================
; 還有一種思路是 : (但是比較占空間)
mov eax, 01010101B
mov ebx, 10101010B
and eax, ebx
2. 獲取內存地址 (例如自己寫的 "/bin/sh" 的地址)
;=========================================
; 方案一
;=========================================
global _start:
_start:
jmp target
joker :
pop eax
; Your code
; ...
; ...
target:
call joker
db "/bin/sh", 0
;=========================================
; 方案二
;=========================================
xor eax, eax
push eax ; 字符串以 0 結尾
; "/bin/sh" -> 0x2f 0x62 0x69 0x6e 0x2f 0x2f 0x73 0x68
push 68732f2fH
push 6e69622fH
mov ebx, esp
3.消除 0 字節(jié)
利用低位寄存器例如 al , ah , 進行操作
例如 :
mov eax, 0AH
可以寫成 :
; 首先清空 eax
; 可以用到第一節(jié)中的清空寄存器的指令中的任意一個
shr eax, 8
mov al, 0AH
4. 獲取棧頂指針地址
mov ebx, esp
5. 如何在字符串后添加 \0
首先利用 push [立即數(非0)]
這樣得到的機器碼只有兩位 , 但是真正執(zhí)行的時候被 push 到棧上的數據是 4 字節(jié)
然后再 push 字符串
6. 將 edx 設置為 0
cdq
; 該指令先把edx的每一位置成eax的最高位
; 若eax>=0x80000000, 則edx=0xFFFFFFFF
; 若eax<0x80000000,則edx=0x00000000
; 再把edx擴展為eax的高位。
7. 消除在 push 較小的數的時候 push 指令中的 0 字節(jié)
例如 :
push 0BH
字節(jié)碼為 : 68 0B 00 00 00
我們可以使用下面的指令來消除 0 字節(jié) :
xor eax, eax
mov al, 0BH
push eax
這樣得到的字節(jié)碼為 :
31 c0
b0 0b
50
6a 0b
8. 同時清空 RAX, RDX 和 RSI (64位)
xor esi,esi
mul esi