详情见大神的博客:https://sploitfun.wordpress.com/2015/06/07/off-by-one-vulnerability-stack-based-2/
漏洞程序:
//vuln.c
#include <stdio.h>
#include <string.h>
void foo(char* arg);
void bar(char* arg);
void foo(char* arg) {
bar(arg); /* [1] */
}
void bar(char* arg) {
char buf[256];
strcpy(buf, arg); /* [2] */
}
int main(int argc, char *argv[]) {
if(strlen(argv[1])>256) { /* [3] */
printf("Attempted Buffer Overflow\n");
fflush(stdout);
return -1;
}
foo(argv[1]); /* [4] */
return 0;
}
漏洞程序当输入的字符串等于256的时候,从bar函数可以知道,字符串的截断字符\0会覆盖掉ebp,导致ebp的最低有效位为00.
栈空间
从栈空间我们知道,返回ip的地址为ebp+4。需要计算返回地址填充的位置。
使用gdb -q vuln3调试:
解释:-q参数表示不显示gdb版本信息。
diasa main
我们看下发生拷贝字符函数的汇编代码
disas bar
从这里可以看出,buff偏离ebp 0x100。现在要计算出此时的ebp。
在拷贝处,下断点进行调试。
下断点调试,获取ebp的值
从寄存器看到此时的ebp=0xffff020。
那么当ebp返回时,由于最低有效位被填充00,其ebp的值为0xffff000,而返回地址从栈空间可以看出来为0xffff004.
gdb调试获取ebp的值
那么返回地址前的填充长度=0xffff004-(0xffff020-0x100)=0xe4
按照大神博客里面填充,我的shellcode放不下,放到前面发现获取不到shell。猜测是因为esp=0xffff008,放前面没有栈空间了。
屏幕快照 2018-04-10 下午9.26.46.png 屏幕快照 2018-04-10 下午8.34.01.png
网友评论