【发布时间】:2017-04-12 02:22:58
【问题描述】:
不写汇编代码就可以构造shellcode吗?
我尝试编译以下简单的应用程序:
#include <stdlib.h>
int main(int argc, char** argv)
{
char* args[] = { "/bin/bash", NULL };
execve("bin/bash", &args, NULL);
return 0;
}
然后我编译它并使用gdb得到以下内容:
(gdb) x/15i main
0x400506 <main>: push %rbp
0x400507 <main+1>: mov %rsp,%rbp
=> 0x40050a <main+4>: sub $0x20,%rsp
0x40050e <main+8>: mov %edi,-0x14(%rbp)
0x400511 <main+11>: mov %rsi,-0x20(%rbp)
0x400515 <main+15>: movq $0x4005d4,-0x10(%rbp)
0x40051d <main+23>: movq $0x0,-0x8(%rbp)
0x400525 <main+31>: lea -0x10(%rbp),%rax
0x400529 <main+35>: mov $0x0,%edx
0x40052e <main+40>: mov %rax,%rsi
0x400531 <main+43>: mov $0x4005de,%edi
0x400536 <main+48>: callq 0x4003f0 <execve@plt>
0x40053b <main+53>: mov $0x0,%eax
0x400540 <main+58>: leaveq
0x400541 <main+59>: retq
很遗憾,我不能使用它来生成 shellcode,因为使用了全局偏移表 [main+48]。
如何修复此方法以生成 shellcode 而无需返回汇编。
【问题讨论】:
-
我不认为你可以让编译器生成可以直接用作shell代码的代码。
标签: assembly exploit shellcode