初探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=1 simple.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,由于是第一次尝试,文章可能诸多纰漏,希望各位师傅不要介意,希望师傅们能多多指点。