Liunx下对php内核的调试

0x01前言

主要是对上一篇文章中php_again这道题的补充。

0x02下载php源码

cd /usr/local
wget https://www.php.net/distributions/php-8.2.2.tar.gz
tar -zxvf php-8.2.2.tar.gz && cd php-8.2.2

0x03编译

注意带enable-debug

apt-get install build-essential autoconf automake libtool libsqlite3-dev pkg-config libjpeg-dev libpng-dev libxml2-dev libbz2-dev libcurl4-gnutls-dev libssl-dev libffi-dev libwebp-dev libonig-dev libzip-dev
./configure --prefix=/usr/local/php --sysconfdir=/etc/php/8.2 --with-openssl --with-zlib --with-bz2 --with-curl --enable-bcmath --enable-gd --with-webp --with-jpeg --with-mhash --enable-mbstring --with-imap-ssl --with-mysqli --enable-exif --with-ffi --with-zip --enable-sockets --with-pcre-jit --enable-fpm --with-pdo-mysql --enable-pcntl --enable-debug
make && make install
cd /usr/bin
ln -s /usr/local/php/bin/php php8.2
cp /usr/local/php-8.2.2/php.ini-development /usr/local/php/lib/php.ini                  
cp /etc/php/8.2/php-fpm.conf.default /etc/php/8.2/php-fpm.conf
cp /etc/php/8.2/php-fpm.d/www.conf.default /etc/php/8.2/php-fpm.d/www.conf

0x04下载gdb工具

apt-get update
apt install gdb

0x05调试样例

调试php中 生成 system_id的两个函数(zend_startup_system_id,zend_finalize_system_id),分别在 mian.c文件的第2237行第2288

cd  /usr/local/php/bin
#即php可执行文件目录

先在这两处打断点

image-20230624224500017

接下来执行 run 一个php文件。

image-20230624224544890

step 单步进入该函数。

n下一步

print var 打印变量

image-20230624224657010

该函数运行完后,context的值是。(因为enable-debug了,所以NTS后还有一个debug,正常情况下是没有的)

image-20230624224813841

跳出该函数后,输入 c进入下一个断点。

image-20230624224950243

同样 step单步跳入。可以看到第二个 if语句是进去了,hooks的值为 “\x02”

image-20230624225145094

接下来是个 for循环,一个都没进去,所以 context的值没有更新。最后 context的值是。

image-20230624230302252

把 debug去掉放 python跑一下。

这下跑的结果是正确的。

image-20230624230621876

0x06一些细节

zend_compile_filecompile_file 是不一样的。让我们看看发生了什么。

watch  zend_compile_file

image-20230624231632720

编译时开启 dtrace并且,环境变量中有 USE_ZEND_DTRACE 时才会进入这个if 。 所以这个时候 zend_compile_file是等于 compile_file的。

image-20230624231847063

在phar.c中还会改变一次。之后就会调用 zend_finalize_system_id.

image-20230624232239320

0x07后记

额,源码看不懂,就跟着看了下变量信息,主要简单了解下如何使用gdb调试。

__EOF__

  • 本文作者: cyyyy
  • 本文链接: https://www.cnblogs.com/cyyyyi/p/17501886.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • © 版权声明
    THE END
    喜欢就支持一下吧
    点赞0

    Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYSEWR5L' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
    admin的头像-五八三
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    图形验证码
    取消
    昵称代码图片