2014-02-17 147 views
0
_start: 
    jmp short call 

shell: 
    pop esi 
    movsd ;move 4 byte from esi to edi (/bin) 
    mov edx,edi ;edx contains /bin 
    xor edi,edi 
    movsw ;move 2 bytes (/s) 
    xor ebx,ebx 
    mov ebx,edi ;ebx contains /s 
    xor eax,eax 
    xor edi,edi 
    movsb 
    mov eax,edi ;eax contiene h 
    mov esi,edx ;esi contains /bin 

    xor ecx,ecx 
    push ecx 
    mov edx,esp ;edx dword NULL 

    push ecx ;NULL 
    push ecx ;NULL 
    add esp,3 ;0 
    push eax 
    add esp,3 ;h 
    push ebx 
    add esp,2 ;/s 
    push esi ;/bin 
    mov ecx,esp ;/bin/sh0,NULL 

    xor edi,edi 
    push edi 
    add esp,3 ;0 
    push eax 
    add esp,3 
    push ebx 
    add esp,2 
    push esi 
    mov ebx,esp ;/bin/bash0 

    xor eax,eax 
    mov al,0xb 
    int 0x80 

call: 
    call shell 
    path db "/bin/sh" 

我试图写生成一个壳的shellcode(JMP-呼叫流行),但我对movsd指令(段错误)有问题。我不明白什么是错误的,我设置ESP的字符串,所以movsd应该从esi移动4字节到EDI的权利?但是,为什么它是segfaulting?x86汇编,MOVSD段错误

回答

2

movsd将4个字节从esi指向的内存移动到edi指向的内存。你还没有初始化edi,所以这是一个存储到任意地址;它发生段错误并不奇怪。

英特尔架构手册,第2卷(这是免费下载,可以回答你所有的基本组件的问题下载他们和在哪里可以找到的东西,如果你要来编写汇编熟悉。):

将第二个操作数 (源操作数)指定的字节,字或双字移动到第一个操作数 (目标操作数)指定的位置。 位于内存中的源操作数和目标操作数都是 。

+0

'lea edi,[edx]'给我段错误!但是我正在用edx的地址初始化edi ...我是对的吗? – polslinux

+0

没有“edx'的地址”; 'lea edi,[edx]'相当于'mov edi,edx',这并没有帮助,因为edx'也是未初始化的。如果您需要一些时间来熟悉x86汇编的基础知识,您最好花点时间。 –

+0

告诉我,如果我是正确的:我不能将4字节的字符串直接保存到寄存器右边?我必须在.bss部分中使用缓冲区...或不是? – polslinux