c - 用于生成 shell 的十六进制代码实现

标签 c linux shell hex buffer-overflow

我正在尝试实现 smashing the stack for fun and profit by Aleph 中给出的代码了解缓冲区溢出攻击的基础知识。

机器架构:Ubuntu 12.10 64位

在 gcc 中使用 -m32 标志编译的程序

到目前为止,我已经成功地使用汇编指令生成了一个 shell。下一步是将这些指令转换为十六进制代码,我就遇到了这个问题。 生成 shell 的汇编代码:

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"

应用断点后,我认为问题出在十六进制代码中,但我一直无法弄清楚。另外,我似乎不明白这里非法指令的上下文。

如有任何帮助,我们将不胜感激。

最佳答案

您在 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";

关于c - 用于生成 shell 的十六进制代码实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16440143/

相关文章:

并发进程和随机整数

c - 如何评估二叉树(中序)?

bash - $做什么?和 $# 在 Shell 脚本中代表什么?

c - 字符串中的第二个空字符被忽略

linux - 删除尾随字符串

linux - 打开 AppImage 什么都不做。我能做些什么?

c - 同步管道访问以进行两种方式的读/写

shell - 如何将shell中的strace解析为纯文本?

ruby - 如何使用 Ruby 编写 shell 脚本?

arrays - 变量零初始化会降低性能吗?