EggHunter未找到鸡蛋(32位),导致无限循环
我有一个例子,那张照片我们找到了鸡蛋!哪个有效,另一个打印你好蛋!那是行不通的。

两者都使用相同的鸡蛋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


而无法正常工作的hello egg代码是:
    全局_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

最佳答案

您的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)


学习使用调试器,以便您逐步阅读代码并查看其作用。

关于c - EggHunter未找到鸡蛋,导致无限循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32363318/

10-11 18:45