linux從彙編提取shellcode相關知識點

2021-08-19 17:08:06 字數 1708 閱讀 7120

一、64位暫存器需要注意的

1.使用者模式的系統呼叫依次傳遞的暫存器為: 

rdi,rsi,rdx,rcx,r8和r9; 

2.核心介面的系統呼叫一次傳遞的暫存器為: 

rdi,rsi,rdx,r10,r8和r9;注意這裡和使用者模式的系統呼叫只有第4個暫存器不同,其他都相同。 

3.系統呼叫通過syscall指令進入,不像32位下的彙編使用的是int 0x80指令; 

4.系統呼叫號放在rax暫存器裡; 

5.系統呼叫限制最多6個引數;

6.系統呼叫的返回結果,也就是syscall指令的返回放在rax暫存器中; 

7.只有整形值和記憶體型的值可以傳遞給核心

8、同時相對於32位的eax ax ah al  ....edx (32位)dx(16位) dh(8位) dl(8位),di(16位),si(16位),64位系統增加dil和sil用於表示rdi和rsi的低8位。。主要用於傳參的時候,避免shellcode中出現不必要的\x00字元

二、編寫彙編**

呼叫32位write系統呼叫的例子(效果是向螢幕列印輸出abcd,最後會報錯,但是可以列印):

root@metasploitable:~# cat write.asm 

section .text

global _start

_start:

xor eax,eax

push eax  ;補結尾字元

push 0x64636261  ;壓棧字串

mov ecx,esp  ;傳字串引數到ecx

xor ebx,ebx

mov bl,0x1  ;傳stdout到ebx

xor edx,edx  

mov dl,0x5  ;列印輸出五個字元,賦給edx

xor eax,eax

mov al,0x4  ;系統呼叫號

int 0x80  ;write(1,"abcd",5)  引數分別對應ebx,ecx,edx

對應64位的版本:

section .text

global _start

_start:

xor rax,rax

push rax

push 0x64636261

mov rsi,rsp

xor rdi,rdi

mov dil,0x1

xor rdx,rdx

mov rdx,0x5

xor rax,rax

mov al,0x1

syscall

三、彙編並提取shellcode

nasm -f elf write.asm     如果是64位則  nasm -f elf64 write.asm,否則指令格式不一致,會報錯

然後 ld -o write  write.o  生成可執行檔案

接下來,可以objdump -d write  反彙編以對照檢查

最後,od -tx1 write  就可以提取 shellcode,效果如下:  -tx1  表示以一位16進製表示,對應地,-tx2或者-h表示兩位16進製制顯示

如果需要將shellcode賦給程式輸入,還需要借助python -c 'print "\x48\x31\xc0……"'  技巧是把od的結果拷貝到編輯器,然後用\x替換空格就ok了。

shell從字串中提取,替換字元

假設需要提取libgcc 4.8.5 4.h5 64.rpm中的版本號 echo libgcc 4.8.5 4.h5 64.rpm grep eo 0 9 0 9 x86 64 grep 的 o 選項,可以只列印匹配的部分,否則會列印整行 echo libgcc 4.8.5 4.h5.x86 64....

ARM彙編 從內嵌彙編開始

對於基於arm的risc處理器,gnu c編譯器提供了在c 中內嵌彙編的功能。這種特性提供了c 沒有的功能,比如手動優化軟體關鍵部分的 使用相關的處理器指令。asm volatile hlt asm 表示後面的 為內嵌彙編,asm 是 asm 的別名。volatile 表示編譯器不要優化 後面的指令...

從C語言到彙編,從彙編到C語言

看雪一同志寫的文章,我覺得很基礎和有用,知識著眼於小處。積累才是王道!一 迴圈語句與發彙編後的機器語言 1 for迴圈 下面是一段c語言的 我們的目的是來看其反彙編的結果 int myfunction int a,int b return c 前面的反彙編暫時不理它,這裡從for的地方開始反彙編,結...