2015-03-13 27 views
-1

我想覆蓋main()的地址與我在彙編中編寫的shellcode的返回地址。試圖執行彙編程序字節流作爲C本地函數

我的彙編程序:

ExitShell.asm

SECTION .text 
global _start 

_start: 

    jmp short shellOffset 

    Shellcode: 

     pop esi 
     lea ecx, [esi] 
     mov dl, 12 
     mov bl, 1 
     mov al, 4 
     int 0x80 
     mov bl, 20 
     mov al, 1 
     int 0x80  


    shellOffset: 

     call Shellcode 
     msg db "Hello World",0xa 

我的.c文件中,我改寫返回地址:

ShellCode.c

#include<stdio.h> 

char shellcode[] = "\xeb\x11\x5e\x8d\x0e\xb2\x0c\xb3\x01\xb0\x04\xcd\x80"\ 
      "\xb3\x14\xb0\x01\xcd\x80\xe8\xea\xff\xff\xff"\ 
       "\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x0a"; 

    void main() 
    { 

     int *ret; 
     ret = (int *)&ret + 2; 
     (*ret) = (int)shellcode; 


    } 

我使用以下命令編譯程序:

gcc -O0 -o sh ShellCode.c -fno-stack-protector -zexec -fno-asynchronous-unwind-tables -g 

當我執行程序時,我收到了分段錯誤錯誤。將程序加載到gdb中,發現它在彙編中的ret語句中給出錯誤

Dump of assembler code for function main: 
    0x080483b4 <+0>: push %ebp 
    0x080483b5 <+1>: mov %esp,%ebp 
    0x080483b7 <+3>: sub $0x10,%esp 
    0x080483ba <+6>: lea -0x4(%ebp),%eax 
    0x080483bd <+9>: add $0x8,%eax 
    0x080483c0 <+12>: mov %eax,-0x4(%ebp) 
    0x080483c3 <+15>: mov -0x4(%ebp),%eax 
    0x080483c6 <+18>: mov $0x804a040,%edx 
    0x080483cb <+23>: mov %edx,(%eax) 
    0x080483cd <+25>: leave 
=> 0x080483ce <+26>: ret 

問題是什麼?我無法理解。請幫忙。我是新來的。

+0

你可能試圖完成什麼?爲什麼不在C代碼中嵌入'asm'指令,而不是組裝代碼並轉換爲C字符串?在這種情況下,編譯器對調用約定和所有代碼生成的理解比你更多。 – msw 2015-03-14 18:04:02

回答

2

這可能有很多原因。您禁用堆棧粉碎檢測器,但這並不意味着,主要的ret將在返回地址之後立即分配。編譯器和鏈接器在對齊變量地址以提高性能或滿足CPU對齊要求方面有一定的餘地。

另一個問題是,shellcode將被放置在.data段中,該段可能被設置爲不可執行,因此主返回到shellcode會觸發該陷阱。

+0

感謝您指出.. :)我忘了在編譯語句中添加堆棧字。它應該是.. gcc -o sh ShellCode.c -fno-stack-protector -z execstack – 2015-03-13 19:25:04