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

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖