【发布时间】:2017-09-03 04:52:21
【问题描述】:
我有点困惑第一个 shellcode 示例是如何工作的。我已经通过 GDB 运行它并且我已经验证它是正确的,但我不确定它最终是如何工作的。下面是代码的样子:
char shellcode[] =
"\xeb\x13\x59\x31\xc0\xb0\x04\x31\xdb\x43\x31\xd2\xb2\x0f\xcd\x80"
"\xb0\x01\x4b\xcd\x80\xe8\xe8\xff\xff\xff\x48\x65\x6c\x6c\x6f"
"\x20\x77\x6f\x72\x6c\x64\x0a\x0d";
int main()
{
int *ret;
ret = (int *)&ret + 2;
(*ret) = (int)shellcode;
return 0;
}
(实际上,我已经将最初生成 shell 的 shellcode 替换为打印“Hello world”的 shellcode,但这应该没什么区别。)
ret 只有一个整数指针,它应该只有 4 个字节长,它怎么能工作? shellcode 本身大约有 40 个字节长!如果有的话,所有 ret 应该检索的是 shellcode 的前 4 个字节,而不是执行整个事情!
有人可以向我解释一下这是如何工作的吗?
【问题讨论】: