CTF-PWN网络安全

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

2018-04-10  本文已影响77人  Magicknight

详情见大神的博客: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
上一篇下一篇

猜你喜欢

热点阅读