bof.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
目标很明确,
gets函数在读取输入时没有限制字符串长度,
我们需要把变量key的值覆盖成0xcafebabe,
好让if语句中的判断为真
用ida很方便地看到s的地址是ebp-2ch,
根据函数调用的过程,
返回地址是ebp+4,
第一个参数地址是ebp+8,
相差44+8个字节,
再加上要覆盖key变量的目标值0xcafebabe
总长度56个字节,
考虑小端法存储,
字符串的内容是 任意字符*52+‘\xbe\xba\xfe\xca’
弄个脚本