2014-02-12 27 views
0

我试图读取组件的文件(86,IA-32)中读取文件,我发现这个例子:在组件86 IA-32

mov ebx,eax 
mov al,0x3 
mov edi,esp 
mov ecx,edi 
xor edx,edx 
mov dh,0xff 
mov dl,0xff 
int 0x80 

其中eax中(第一指令)有开放系统调用的返回码。
有,我还没有完全了解两两件事:

  1. 为什么做mov edi,esp然后mov ecx,edi而不是做直接mov ecx,esp
  2. 为什么把0xff0xff放在edx寄存器里面?读系统调用期望count所以在这种情况下的文件大小。

EDIT(完整代码):

section .text 

global _start 

_start: 
    ;read the file 
    jmp short call_rw 

rw: 
    push 0x5 
    pop eax 
    pop ebx 
    xor ecx,ecx 
    int 0x80 
    mov ebx,eax 
    mov al,0x3 
    mov edi,esp 
    mov ecx,edi 
    xor edx,edx 
    mov dl,0xff 
    mov dh,0xff 
    int 0x80 
    mov edx,eax 
    push 0x4 
    pop eax 
    mov bl, 0x1 
    int 0x80 
    push 0x1 
    pop eax 
    inc ebx 
    int 0x80 

call_rw: 
    call rw 
    message db "/home/user/file.txt" 
+0

你还没有指定你的目标操作系统,但我猜测Linux(?)。 – Michael

+0

对不起!是的Linux(Gentoo x86) – polslinux

+0

@JerryCoffin我的错,我点击太快回答xD我更新了我的问题! – polslinux

回答

1

关于第一个问题,我看到一对夫妇的相当明显的可能性,但问题并没有包含足够的信息,以确保这很可能准确。

第一个可能性是,在edi大小被用于在后面的代码一些其他的目的,所以此举对edi已经完成了一些有用的东西,但我们不能看到究竟是什么在这里,因为我们不能看到使用它的其他代码。

另一个明显的可能性就是它只是一个错误。

有几个不太明显的可能性,例如mov ecx, edi被用作其他代码的入口点,所以如果您从该代码的开始处开始,它使用的值为esp,但还有其他代码将一些其他值加载到edi,然后跳转到mov ecx, edi,从而使用不同的值而不是esp中的值。

还有一些其他的可能性,例如某人基本上插入了一些NOP的等价物(例如)让一部分代码与某个边界对齐,但没有尽可能多的分心线,就好像它们会写出NOP(说)5次。

对于第二个问题,0xffff在edx基本上意味着它将从该文件读取多达65535个字节。他们很可能分配了一个65535字节的缓冲区,所以他们不想在一次调用中读取更多的数据。

编辑(完成代码添加到问题后)。好的,现在我们可以看到完整的代码,我们可以从代码是(尽可能好的)非常传统地写入开始。

他首先跳到call_rw,然后(显然是不够)call ing rw从那里。这会在call_rw之后立即将地址推入堆栈。然后在rw处,他从堆栈中弹出返回值为ebx。这将message的地址加载到ebx中,然后将其用作下一个系统调用(函数5,它打开文件,期望ebx包含指向文件名称的指针)的参数。

不好意思,我只想猜测代码要么是故意(但相当低效)的混淆尝试,要么是内部生成某种面向堆栈的内部代码的编译器的结果,然后在将其转换为面向注册的目标代码方面做了非常糟糕的工作。或者我的第一印象(见下面的脚注)是正确的。

取出克鲁夫特后,第一对夫妇的SYS通话摸出这东西一般顺序:

; open the file 
mov eax, 5 
mov ebx, offset filename 
xor ecx, ecx 
int 0x80 

; read the file 
mov ebx, eax 
mov eax, 3 
mov ecx, esp 
mov edx, 0xffff 
int 0x80 

很抱歉,但我懒得整理出所有的休息。乍一看,它看起来像进入了一个无限循环(call_rw之前的代码流入call_rw,再次呼叫rw)。它的一些体操可能会阻止实际发生,但如果没有一个有说服力的理由来解决这个问题,我就没有动力去理清这个特定的混乱。


  1. 我在为外交在这里工作真的。在修订之前,这提到了作者是“可认证的精神病患者”。
+0

好吧,我明白了0xffff的意思!谢谢 :) – polslinux