作者cobrasgo (体重突破所有均线)
看板LinuxDev
标题[问题] shellcode不work
时间Wed Dec 29 18:49:48 2010
以下是程式码
===================
#include <stdio.h>
#include <string.h>
char shellcode[]="\x31\xdb\x89\xd8\x40\xcd\x80";
unsigned long sp(void){
__asm__(
"movl %esp, %eax;"
);
}
void test(){
int* ret;
ret = (int*)&ret + 2;
(*ret) = (int)shellcode;
printf("test\n");
}
int main(int argc, char** argv){
test();
return 0;
}
===================
shellcode的内容就是很简单的exit()
这个程式的目的只是要测试一下这个程式是否能work
预期的行为是printf("test\n");这行不会被执行直接结束程式
不过一执行就死
我用gdb trace的流程是这样
首先在test()设break point
接下来一行一行印东西来看
Breakpoint 1, test () at missingPrintf.c:15
15 ret = (int*)&ret + 2;
(gdb) x/16aw ret
0x1: Cannot access memory at address 0x1
(gdb) n
16 (*ret) = (int)shellcode;
(gdb) x/16aw ret
0xbfffe82c: 0x804826c <main+22> 0x3 0xbfffe850 0xbfffea68
0xbfffe83c: 0x80484b8 <__libc_start_main+552> 0x20615 0x3 0xbfffea68
0xbfffe84c: 0x80484b8 <__libc_start_main+552> 0x1 0xbfffea94 0xbfffea9c
0xbfffe85c: 0x0 0x0 0x694c0000 0x78756e
(gdb) n
17 printf("test\n");
(gdb) x/16aw ret
0xbfffe82c: 0x80bd084 <shellcode> 0x3 0xbfffe850 0xbfffea68
0xbfffe83c: 0x80484b8 <__libc_start_main+552> 0x20615 0x3 0xbfffea68
0xbfffe84c: 0x80484b8 <__libc_start_main+552> 0x1 0xbfffea94 0xbfffea9c
0xbfffe85c: 0x0 0x0 0x694c0000 0x78756e
(gdb)
看得出来return address(main+22)已经被shellcode的address盖掉
请问一下为什麽这样子还会core dump?
而且test那行也被执行了
所以就是这样写应该是有问题的
请大神们指教一下
我卡了好久啊…
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.130.51.128
※ 编辑: cobrasgo 来自: 220.130.51.128 (12/29 18:53)
1F:→ dislinux:没意外的外只是作业系统禁止资料区段执行程式 01/01 00:46
2F:→ dislinux:编译时加gcc -z execstack 应该可以解决问题 01/01 00:46