2013-11-02 34 views
1

这里后改变是一个汇编代码片段:硬编码地址组装

jmp short getadd 

shellcode: 
    pop esi 
    xor eax, eax 
    mov byte [esi+9], al 
    push dword esi 
    call 0x8048300 
    ; adress found by deassmembling a c program for printf 

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

getadd: 
    call shellcode 
    db "nice job!" 

但后倾我找到的对象:

Disassembly of section .text: 

00000000 <shellcode-0x2>: 
    0: eb 14     jmp 16 <getadd> 

00000002 <shellcode>: 
    2: 5e      pop %esi 
    3: 31 c0     xor %eax,%eax 
    5: 88 46 09    mov %al,0x9(%esi) 
    8: 56      push %esi 
    9: e8 fc 82 04 08   call 804830a <getadd+0x80482f4> 
    e: 31 c0     xor %eax,%eax 
    10: b0 00     mov $0x0,%al 
    12: 31 db     xor %ebx,%ebx 
    14: cd 80     int $0x80 

00000016 <mycall>: 
    16: e8 e7 ff ff ff   call 2 <shellcode> 
    1b: 6e      outsb %ds:(%esi),(%dx) 
    1c: 69 63 65 20 6a 6f 62 imul $0x626f6a20,0x65(%ebx),%esp 
    23: 21      .byte 0x21 

为什么地址从改变0x8048300到804830a?

+2

您可以享受,这是非常愉快的有[objdump的输出Intel语法(http://stackoverflow.com/questions/10362630/how-can-objdump-emit-intel-syntax)。 –

+0

真的,谢谢先生Jonathon – silentboy

+0

另外,为什么你在运行时null结束字符串?只要做'db'很好的工作!“,0' –

回答

3

英特尔指令集参考文件的破解时间!

E8CALL rel32

呼叫附近,相对的,相对于下一条指令位移。

这意味着你调用绝对地址0x8048300,而你在一些排量从你身在何处,现在打电话来的地址(实际上是从下一条指令)。

如果你想调用一个绝对地址,你需要使用FFCall r/m32(调用寄存器或内存地址)的形式。

mov eax, 0x8048300 
call eax 
+0

这个http://www.kernel-panic.it/security/shellcode/shellcode2.html#shellcode-2.2教程显示,调用绝对像我用。尝试,如果你的方法的作品:) – silentboy

+0

@silentboy也许我只是累了,但我不知道如何可以工作,除非你知道你的代码的地址。你的代码从哪里执行?按预期工作的 –

+0

。谢谢 – silentboy