初探php擴充套件之MAC下環境配置篇
0x1 前言
我是一個熱衷實戰而且對攻防特別感興趣的菜雞,之前看到p神在php擴充套件上留一句話後門就對這種技術產生了強烈好奇心,但是由於其他因素的影響導致遲遲沒有進行研究,趁著最近時間還算寬裕,打算對php擴充套件進行入門式學習,首先先從環境配置開始講起
0x2 除錯環境搭建
在mac下搭建除錯環境的教程比較少,前前後後一步一步踩著坑過來的。
0x2.1 嘗試docker失敗
參考先知一個師傅的思路初探php擴充套件層面(一),通過docker來快速搭建除錯環境。
但是部分連結失效了,導致docker沒辦法建立起來,後門放棄了。
0x2.2 本地環境搭建
0x2.2.1 獲取php原始碼(1)
參考教程:MAC搭建PHP除錯環境
git clone https://github.com/php/php-src.git cd php-src
切換到想構建的分支:
-
PHP 5.3: git checkout PHP-5.3
-
PHP 5.4: git checkout PHP-5.4
-
PHP 5.5: git checkout PHP-5.5
-
PHP 5.6: git checkout PHP-5.6
-
PHP 7.0: git checkout PHP-7.0
-
PHP HEAD: git checkout master
當時通過教程成功安裝了php5.3
安裝php5.3的時候,會提示autoconf版本過高,需要2.9版本的
解決方案:
brew search autoconf
找到了
進行安裝
brew install autoconf@2.13
然後根據提示進行配置下變數在編譯就ok了
但是由於vld只支援php>=7.0,嘗試編譯php7.0的時候出現了一堆未知錯誤,
在百度和google折騰了好久,最後放棄了,但是後面我找了另外一份php7.1.8的原始碼安裝成功了。
0x2.2.1 獲取php原始碼(2)
0.在合適目錄新建個資料夾mkdir ~/Desktop/php擴充套件學習/testphp
cd testphp
1.wget -c http://mirrors.sohu.com/php/php-7.1.8.tar.gz
2.tar -zxvf php-7.1.8.tar.gz
3../configure--disable-all --enable-debug --prefix=~/Desktop/php擴充套件學習/testphp/php7
--disable-all
代表不安裝任何擴充套件,一定要選上要不然編譯會失敗,--enable-debug
開啟除錯
4.make && make install
成功的話就會看到
xq17@localhost ~/Desktop/php擴充套件學習/testphp/php7 tree -L 3 . ├── bin │├── php │├── php-cgi │├── php-config │├── php.ini │├── phpdbg │├── phpize │├── simple.php │├── test ││├── gdb-8.0 ││├── gdb-8.0.tar.gz ││├── gdb-8.0.tar.gz.1 ││├── index.html ││├── wget-log ││├── wget-log.1 ││└── wget-log.2 │├── test1.php │└── vld │├── CREDITS │├── Changelog │├── EXPERIMENTAL │├── LICENSE │├── Makefile │├── Makefile.frag │├── Makefile.fragments │├── Makefile.global │├── Makefile.in │├── Makefile.objects │├── README.rst │├── acinclude.m4 │├── aclocal.m4 │├── autom4te.cache │├── branchinfo.c │├── branchinfo.h │├── branchinfo.lo │├── build │├── config.guess │├── config.h │├── config.h.in │├── config.log │├── config.m4 │├── config.nice │├── config.status │├── config.sub │├── config.w32 │├── configure │├── configure.in │├── include │├── install-sh │├── libtool │├── ltmain.sh │├── missing │├── mkinstalldirs │├── modules │├── package.xml │├── php_vld.h │├── rebuild-all.sh │├── rebuild.sh │├── run-tests.php │├── set.c │├── set.h │├── set.lo │├── srm_oparray.c │├── srm_oparray.h │├── srm_oparray.lo │├── tests │├── vld.c │├── vld.dsp │├── vld.dsw │├── vld.la │└── vld.lo ├── include │└── php │├── TSRM │├── Zend │├── ext │├── include │├── main │└── sapi ├── lib │└── php │├── build │└── extensions ├── php │└── man │└── man1 └── var ├── log └── run
cd bin
//進入bin目錄
./php --version
這樣就可以了,因為mac自帶php,我們可以去設定當前路徑為全域性路徑,這樣php
命令呼叫的就是我們當前的編譯的php檔案
1.export PATH="/Users/xq17/Desktop/php擴充套件學習/testphp/php7/bin:$PATH"
這個方法只在當前命令列有效
2.sudo vim /etc/paths
新增/Users/xq17/Desktop/php擴充套件學習/testphp/php7/bin
這樣就永遠有效了
這樣代表我們已經編譯完成了,下面就是安裝vld擴充套件了。
0x2.2.2 安裝vld擴充套件
vld擴充套件能劫持opcode,方便我們除錯程式碼。
切換bin
目錄下
依次執行:
1.git clone https://github.com/derickr/vld.git 2.cd vld 3.phpize 4../configure 5.make && make install
然後提示成功之後,命令列會顯示生成的擴充套件路徑
切換到bin
目錄下vim php.ini
新建
[vld] extension=vld.so
然後新建個檔案vim simple.php
<?php $a = 1; $b = $a + 1; echo $b; ?>
php -dvld.active=1simple.php
進行vld測試
這樣就代表安裝成功了。
0x 2.2.3 配置Clion環境
參考教程:mac下最簡單安裝破解CLion 2018 安裝了clion最新版(去官網下在破解)
首先匯入專案:
然後在根目錄下新建個檔案: new file->CMakeLists.txt(clion編譯不能直接識別make,所以需要進行轉換下)
cmake_minimum_required(VERSION 3.3) project(hank) add_custom_target(makefile COMMAND make && make install WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
如圖配置就行了,回到CLion,開啟sapi/cli/php_cli.c
檔案,在main函式進行斷點,如下圖:
加入斷點後,點選選單Run -> Debug 'makefile'
,等待IDE編譯完成後,若出現下圖即大功告成。
這種圖形除錯介面,我個人不是很喜歡,我覺得gdb那種命令除錯風格可能更適合我,但是mac安裝gdb除錯似乎是個巨坑。
0x2.2.3 配置GDB除錯環境
1.homebrew install gdb
安裝的是8.2.1版本的,首先就是一個
During startup program terminated with signal ?, Unknown signal.
類似的錯誤,網上很多,
通過brew info gdb
可以得到解決方法echo "set startup-with-shell off" >> ~/.gdbinit
當我原本以為這樣就ok的時候,發現悲催的是,又出現了
During startup program terminated with signal SIGTRAP, Trace/breakpoint trap.
之類的錯誤,網上的建議是直接回退8.0.1版本
brew uninstall gdb
brew install https://github.com/Homebrew/homebrew-core/raw/9ec9fb27a33698fc7636afce5c1c16787e9ce3f3/Formula/gdb.rb
當我以為這樣就ok的時候
結果是很絕望的,折磨了好久,又聽到先知的師傅說mac os下的gdb巨坑,最後我還是向docker屈服了.
1.docker search gdb
然後找到了一個還不錯的
2.docker pull 0utman/ubuntu-php55-gdb-debug
3.docker run -it--security-opt seccomp=unconfined 0utman/ubuntu-php55-gdb-debug bash
vim test.php
<?php $a=1+2; echo $a; ?>
gdb --args php test.php
然後run
設定個break main
斷點
這樣就大功告成了。
0x3 快速編寫一個簡單的擴充套件
因為這裡主講環境配置篇,所以不想過多涉及原理,對原理感興趣的同學,可以期待我的下篇手把手分析如何編寫與修改擴充套件,不過這裡我還是分享兩個我學習這方面的連結。
《PHP擴充套件開發及核心應用》 這本書講的相當好,不過感覺有點老
PHP7核心剖析 其實我是打算擴充套件->核心去學習的
回到正題上了。
0x3.1 快速建立基本框架
./ext_skel --extname=myfirstextt
去掉箭頭所指的dnl(config.m4是個配置檔案檔案,有自己的語法結構,del代表是註釋類似python的#
)
然後在
然後在clion開啟命令列分別執行以下命令
1.phpize 2../configure 3.make 4.make install
這樣就代表成功了,生成的框架有個測試的php檔案
這個指令碼通過利用dl函式來載入擴充套件,我們也可以修改php.ini來載入擴充套件。
(ps: cli模式一條命令一個新程序所以無須重啟php,網上說的重啟是 php作為apache一個模組 用的是Server Application Programming Interface: the API used by PHP to interface with Web Servers)
這樣代表成功了
0x3.2 簡單添加個函式並且輸出內容
參考文章:菜鳥學php擴充套件 之 hello world(一)
編輯myfirstextt.c
檔案,需要修改兩處
PHP_FUNCTION(helloworld) { php_printf("Hello World,xq17! \n"); RETURN_TRUE; }
然後
1. ./configure 2.make && make install
php -d enable_dl=On -r "dl('myfirstextt.so');helloworld();"
0x4 預告
這篇主要是記錄我這種菜雞在配置方面走的坑,下篇才是我重點花時間去研究的方向,可以淺談下php的生命週期,然後去重點分析擴充套件的原理,以及如何編寫、修改程式碼,然後在擴充套件層面去做一個backdoor,由於是第一次嘗試,文章可能諸多紕漏,希望各位師傅不要介意,希望師傅們能多多指點。