0x0前言 虎符比赛遇到了一题极其类似p神做过的题,只是底层操作系统是Debian,无法使用p神的思路解决。
本着遇到了就调一调的精神 尝试了一下调试 验证p神的操作 也试着“完成p神未完成之路”
调试所需环境:
Macos
CLion
Vscode
php
1 <?php (empty ($_GET ["env" ])) ? highlight_file (__FILE__ ) : putenv ($_GET ["env" ]) && system ('echo hfctf2022' );?>
nginx/default.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri / =404 ; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass 127.0.0.1:9000 ; } }
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 FROM php:7.4 .28 -fpm-busterLABEL Maintainer="yxxx" ENV REFRESHED_AT 2022 -03 -14 ENV LANG C.UTF-8 RUN sed -i 's/http:\/\/security.debian.org/http:\/\/mirrors.163.com/g' /etc/apt/sources.list RUN sed -i 's/http:\/\/deb.debian.org/http:\/\/mirrors.163.com/g' /etc/apt/sources.list RUN apt upgrade -y && \ apt update -y && \ apt install nginx -y ENV DEBIAN_FRONTEND noninteractiveCOPY index.php /var/www/html COPY default.conf /etc/nginx/sites-available/default COPY flag /flag EXPOSE 80 CMD php-fpm -D && nginx -g 'daemon off;'
0x1源码获取 https://command-not-found.com/
这个网站可以输入命令来获取该命令对应的软件包
比如我们输入echo 可以发现网站提示了在各种编程语言下获取该软件的方式
因为赛题环境是debian我们前往Debian Package 搜索coreutils
搜索后会发现Debian Package提供了完整匹配
和部分匹配
的软件包地址
点击完整匹配
对应的软件包路径 可以看到网站右侧即可下载源码
如果我们想确定我们目标环境中coreutils的版本 可以使用dpkg -l
的方式来检索软件包版本
0x2dash调试环境搭建 dash源码获取途径如0x1节
解压后进入目录
cd /Users/su/Desktop/code/c/dash-0.5.10.2/
我们首先编译dash 并添加调试符号
1 2 3 CFLAGS="-g" ./configure --prefix=/Users/su/Desktop/code/c/dash-0.5.10.2/ && \ make && \ make install
等待编译完成后在当前目录下会出现bin
目录 目录中存放着dash的可执行文件
运行一下测试
我们需要在vscode中安装c/c++
扩展
随后在Debug菜单中选择创建launch.json
然后选择C++(GDB/LLDB)
在生成的json文件中添加调试信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 { "version" : "0.2.0" , "configurations" : [ { "name" : "Debug" , "type" : "cppdbg" , "request" : "launch" , "program" : "/Users/su/Desktop/code/c/dash-0.5.10.2/bin/dash" , "args" : [ "-c" , "echo suanve" ] , "stopAtEntry" : false , "cwd" : "${fileDirname}" , "environment" : [ { "name" : "test" , "value" : "test" } , ] , "externalConsole" : false , "MIMode" : "lldb" } ] }
配置完成保存 打开src/main.c
找到主函数下一个断点 点击调试即可断在main函数