EggHunter没有找到鸡蛋,造成无限循环

时间:2015-09-02 21:21:00

标签: c assembly nasm

EggHunter没有找到蛋(32位),造成无限循环 我有一个例子,打印我们发现了鸡蛋!这是有效的,另一个是打印Hello蛋!那是行不通的。

两者都使用相同的蛋0x90f890f9

我认为问题可能在这里: cmp dword [ecx],0x90f890f9;标记

这是c代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned char egghunter[21];

void main()
{

/* works OK (We found the egg!)

"\x90\xf9\x90\xf8\x90\x68\x21\x0a\x0a\x0a\x68\x20\x65\x67\x67\x68\x20\x74\x68"
"\x65\x68\x6f\x75\x6e\x64\x68\x57\x65\x20\x66\x31\xc9\xb1\x12\x51\xb8"
"\x11\x11\x51\x08\x50\x31\xc0\x50\x54\x51\x89\xe6\x83\xc6\x14\x03\x74"
"\x24\x10\x2b\x34\x24\x56\x89\xf1\xeb\x1c\xeb\x0c\x59\x59\xe2\xe8\x31"
"\xdb\x31\xc0\xb0\x01\xcd\x80\x31\xc0\xb0\xa2\x8d\x5c\x24\x0c\x31\xc9"
"\xcd\x80\xeb\xe6\x31\xd2\xb2\x01\x31\xdb\xb3\x01\x31\xc0\xb0\x04\xcd"
"\x80\xeb\xd4";

*/

/* gives an infinite loop (suppose to print Hello egg!)

"\x90\xf9\x90\xf8\x90\xeb\x17\x31\xc0\xb0\x04\x31\xdb\xb3\x01\x59\x31\xd2\xb2\x0b\xcd\x80"
"\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe4\xff\xff\xff\x48\x65\x6c\x6c"
"\x6f\x20\x65\x67\x67\x21\x0a";

*/

unsigned char shellcode[256] = \
"\x90\xf9\x90\xf8\x90\xeb\x17\x31\xc0\xb0\x04\x31\xdb\xb3\x01\x59\x31\xd2\xb2\x0b\xcd\x80"
"\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe4\xff\xff\xff\x48\x65\x6c\x6c"
"\x6f\x20\x65\x67\x67\x21\x0a";


printf("Shellcode: %d bytes\n", strlen(shellcode));

strcpy(egghunter,"\xeb\x0e\x59\x83\xe9\x17\x81\x39\xf9\x90\xf8\x90\xe0\xf8\xff\xe1\xe8\xed\xff\xff\xff");

printf("Egghunter: %d bytes\n", strlen(egghunter));

int (*ret)() = (int(*)())egghunter;

ret();
}

这是egghunter代码:

global _start
section .text
_start:
  jmp     call_egghunter
egghunter:
  pop     ecx                 ; save addr ptr
  sub     ecx, 23             ; move addr ptr back
next:
  cmp     dword [ecx], 0x90f890f9  ; marker
  loopnz  next                ; dec ecx, jump
  jmp ecx                     ; jump to shellcode
call_egghunter:
  call    egghunter

无效鸡蛋代码是:     global _start

section .text

_start:

    jmp short call_shellcode 


shellcode: 

    ; print hello world on the screen

    xor eax, eax
    mov al, 0x4

    xor ebx, ebx
    mov bl, 0x1

    pop ecx

    xor edx, edx
    mov dl, 11

    int 0x80


    ; exit the program gracefully

    xor eax, eax
    mov al, 0x1

    xor ebx, ebx

    int 0x80

call_shellcode:

    call shellcode
    message: db "Hello egg!", 0xA

1 个答案:

答案 0 :(得分:1)

您的egghunter是一个全局变量,位于数据部分。你的shellcode是一个存在于堆栈中的局部变量。您从egghunter向下搜索标记,但是linux上的常规布局(我假设您使用int 0x80)将堆栈置于数据部分之上。因此,你正在寻找错误的方向,无论你发现什么都不是你的shellcode。实际上,它是执行strcpy(egghunter, literal)

的代码的一部分
   0x80494fe:   movl   $0x90f890f9,0x80497d0
   0x8049508:   movl   $0xe1fff8e0,0x80497d4
   0x8049512:   movl   $0xffffede8,0x80497d8
   0x804951c:   movw   $0xff,0x80497dc
   0x8049525:   movl   $0x80497c8,(%esp)

学习使用调试器,这样您就可以逐步完成代码并查看它在做什么。