背景:
您看到的是机器语言代码。它们是对 CPU 芯片的实际指令的数据值。
当程序员用 C 或 C++ 等高级语言编写程序时,称为编译器的工具会将这些指令转换为机器语言。通常,程序员并不关心那些机器语言指令。但是,编写这些编译器的程序员当然非常关心机器指令,编写例程优化版本的人也是如此(这在高级语言中可能效率低下)。黑客也是如此。
即使程序员有理由关心机器指令,他们也不会像这样以难以阅读的原始字节值编写代码。相反,程序员将使用称为汇编语言的助记指令集。助记符只是代表您在此处看到的数字的缩写名称。一个简单的例子是MOV CL,0x38将字节值 38 移动到名为 C 的寄存器的低半部分。在幕后,“MOV CL”是一个值为 b1 的机器语言字节。
一种称为反汇编程序的工具将帮助将您看到的数字翻译成人类更容易阅读的汇编语言。您可以将这些字节放入http://onlinedisassembler.com/odaweb/#并查看它们将导致 CPU 执行的指令。您的样本包含以下说明:
.data:0x00000006 b879c464b7 mov eax,0xb764c479
.data:0x0000000b 33c9 xor ecx,ecx
.data:0x0000000d b138 mov cl,0x38
.data:0x0000000f 5d pop ebp
.data:0x00000010 83c504 add ebp,0x4
.data:0x00000013 314513 xor DWORD PTR [ebp+0x13],eax
.data:0x00000016 033cd7 add edi,DWORD PTR [edi+edx*8]
.data:0x00000019 864242 xchg BYTE PTR [edx+0x42],al
.data:0x0000001c 3f aas
.data:0x0000001d cf iret
(可以看到上面的助记汇编指令包括mov、xor、pop等)
但是,要为更多的失望做好准备。您选择了一种非常复杂的攻击,该攻击利用了一种称为返回导向编程 (ROP) 的技术,因此大多数字节对我们来说毫无意义,因为它们不是 CPU 指令。它们主要是包含其他例程的参数和地址的数据。这使得这个漏洞特别难以在没有大量工作的情况下进行逆向工程。
更接近您的答案:
对于您的问题,缓冲区溢出是由于 x86 架构上使用内存的方式而起作用的。当程序员允许内存被覆盖时,额外的数据会直接覆盖在其他数据之上。如果你写了正确的字节数,那别的东西就是函数的返回指针。如果您在缓冲区数据中提供机器语言例程,然后覆盖返回指针以返回到您的缓冲区(而不是其正常的返回位置),当 CPU 返回时它将执行您的代码而不是它打算执行的代码。
欺骗指令指针到黑客需要它去的地方的机器代码被称为漏洞利用代码。漏洞利用代码是自定义编写的,以利用每个特定的错误。
对黑客有用的代码称为有效载荷。有效载荷通常是由其他人预先考虑好的,并且通常是黑客的复制和粘贴事件。一个非常常见的有效载荷称为“shellcode”,它是向攻击者生成命令 shell 的机器指令。
漏洞利用需要两者。一旦漏洞获得控制权,它就会调用 shellcode,为黑客提供他想要的访问权限。
一个很好的资源:
这里有一个关于这种利用的在线教程: http ://www.tenouk.com/Bufferoverflowc/Bufferoverflow6.html 请注意,这是非常深奥的东西,该页面的作者假设您了解CPU 操作、堆栈、指针、汇编语言、机器语言等基础知识。