PWN入门第三课(Off-By-One 漏洞)

详情见大神的博客:https://sploitfun.wordpress.com/2015/06/07/off-by-one-vulnerability-stack-based-2/

漏洞程序:

//vuln.c
#include 
#include 

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.


PWN入门第三课(Off-By-One 漏洞)_第1张图片
栈空间

从栈空间我们知道,返回ip的地址为ebp+4。需要计算返回地址填充的位置。

使用gdb -q vuln3调试:

解释:-q参数表示不显示gdb版本信息。


PWN入门第三课(Off-By-One 漏洞)_第2张图片
diasa main

我们看下发生拷贝字符函数的汇编代码


PWN入门第三课(Off-By-One 漏洞)_第3张图片
disas bar

从这里可以看出,buff偏离ebp 0x100。现在要计算出此时的ebp。
在拷贝处,下断点进行调试。
PWN入门第三课(Off-By-One 漏洞)_第4张图片
下断点调试,获取ebp的值

从寄存器看到此时的ebp=0xffff020。

那么当ebp返回时,由于最低有效位被填充00,其ebp的值为0xffff000,而返回地址从栈空间可以看出来为0xffff004.


PWN入门第三课(Off-By-One 漏洞)_第5张图片
gdb调试获取ebp的值

那么返回地址前的填充长度=0xffff004-(0xffff020-0x100)=0xe4

按照大神博客里面填充,我的shellcode放不下,放到前面发现获取不到shell。猜测是因为esp=0xffff008,放前面没有栈空间了。


PWN入门第三课(Off-By-One 漏洞)_第6张图片
屏幕快照 2018-04-10 下午9.26.46.png
PWN入门第三课(Off-By-One 漏洞)_第7张图片
屏幕快照 2018-04-10 下午8.34.01.png

你可能感兴趣的:(PWN入门第三课(Off-By-One 漏洞))