一、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的地方開始反彙編,結...