主要是對(duì)上一篇文章中php_again
這道題的補(bǔ)充。
cd /usr/localwget https://www.php.net/distributions/php-8.2.2.tar.gztar -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-debugmake && make installcd /usr/binln -s /usr/local/php/bin/php php8.2cp /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.confcp /etc/php/8.2/php-fpm.d/www.conf.default /etc/php/8.2/php-fpm.d/www.conf
0x04下載gdb工具apt-get updateapt install gdb
0x05調(diào)試樣例調(diào)試php中 生成 system_id的兩個(gè)函數(shù)(zend_startup_system_id,zend_finalize_system_id),分別在 mian.c文件的第2237行
和第2288
行
cd /usr/local/php/bin#即php可執(zhí)行文件目錄
先在這兩處打斷點(diǎn)
接下來(lái)執(zhí)行 run 一個(gè)php文件。
step 單步進(jìn)入該函數(shù)。
n下一步
print var 打印變量
該函數(shù)運(yùn)行完后,context
的值是。(因?yàn)閑nable-debug了,所以NTS后還有一個(gè)debug,正常情況下是沒有的)
跳出該函數(shù)后,輸入 c
進(jìn)入下一個(gè)斷點(diǎn)。
同樣 step單步跳入。可以看到第二個(gè) if語(yǔ)句是進(jìn)去了,hooks的值為 "\x02"
接下來(lái)是個(gè) for循環(huán),一個(gè)都沒進(jìn)去,所以 context
的值沒有更新。最后 context
的值是。
把 debug去掉放 python跑一下。
這下跑的結(jié)果是正確的。
0x06一些細(xì)節(jié)zend_compile_file
和 compile_file
是不一樣的。讓我們看看發(fā)生了什么。
watch zend_compile_file
編譯時(shí)開啟 dtrace
并且,環(huán)境變量中有 USE_ZEND_DTRACE
時(shí)才會(huì)進(jìn)入這個(gè)if 。 所以這個(gè)時(shí)候 zend_compile_file
是等于 compile_file
的。
在phar.c中還會(huì)改變一次。之后就會(huì)調(diào)用 zend_finalize_system_id
.
額,源碼看不懂,就跟著看了下變量信息,主要簡(jiǎn)單了解下如何使用gdb調(diào)試。
關(guān)鍵詞: