CVE-2023-25139

0x00 背景 TPCTF里和qym师傅研究了两天safehttpd这题(虽然我一直在背英语pre,没干什么活),把整个程序可能的漏洞点翻遍了也没找到突破口的off by null如何触发(实际上是测试过程中出现了重大失误,已经找对了地方却没有测试出漏洞),赛后看wp发现有这样一个CVE: 30068 – (CVE-2023-25139) incorrect printf output for integers with thousands separator and width field (CVE-2023-25139) (sourceware.org) 0x01 分析 先看上面链接中的复现样例: #include <stdio.h> #include <locale.h> int main (void) { if (setlocale (LC_ALL, "")) { printf ("1234567890123:\n"); printf ("%0+ -'13ld:\n", 1234567L); } return 0; } 在有漏洞的Glibc2.37下的输出: 1234567890123: +1,234,567 : 输出的长度是15而不是13,因为两个千位分隔符没有被计入宽度,导致输出时多补了两个空格。 这是一个glibc 2.37里短暂出现就被迅速修复的漏洞:千位分隔符在限制长度的格式化输出时没有被正确计入宽度,导致出现了溢出。 由该commit修复: Account for grouping in printf width (bug 30068) · bminor/glibc@c980549 (github.com) 下面就通过这个修复的commit分析一下这个bug是如何产生的。 其中第266行由 width -= workend - string + prec 改成了...

December 11, 2023 · 2 min · 311 words · JuicyMio

WSL2中C/C++开发环境配置

基础 编辑器: LunarVim 基于clangd的代码提示, compile_commands.json由bear生成, 命令是bear -- make tmux管理窗口(目前又改成了zellij, 感觉快捷键更好用一点) 美化 WSL2: 运行在Windows Terminal中, 安装oh my posh, One Half Dark主题 字体: Fira Code Nerd Font (为了显示LunarVim以及终端中各种小图标) Powerlevel10k 效果: 图炸了() 比之前那个运行在CMD里调个窗口大小就闪退, 配色还极其阴间, 显示不出来图标的状态强了不知道多少. 效率提升 lazygit LunarVim中打包的一些插件差不多够用, 懒得折腾新的了 问题 挂代理也连不上各种东西, 经一通检查之后发现 感觉是wsl和steam++一起干的好事…

July 8, 2023 · 1 min · 40 words · JuicyMio

Phoenix

0x00 前言 Windows+WSL2(Ubuntu22.04)下的exploit.education的phoenix虚拟机环境配置, 但不建议使用Windows配置环境, 比Linux多了不必要的麻烦. 0x01 QEMU安装 官网amd的下载包只有Qcow2格式的可用了, 所以只能装一个QEMU. 去QEMU官网下载一个win版的安装包一路默认就可以了, 可以改个安装地址. 0x02 虚拟机安装以及ssh Linux下直接运行压缩包中的boot脚本即可, 但Windows不行, 我找到个大佬博客提供了脚本.创建一个boot.ps1文件, 把下面的代码复制进去改下qemu的路径即可. D:\Program` Files\qemu\qemu-system-x86_64.exe ` -kernel vmlinuz-4.9.0-8-amd64 ` -initrd initrd.img-4.9.0-8-amd64 ` -append "root=/dev/vda1" ` -m 1024M ` -netdev user,id=unet,hostfwd=tcp:127.0.0.1:2222-:22 ` -device virtio-net,netdev=unet ` -drive file=exploit-education-phoenix-amd64.qcow2,if=virtio,format=qcow2,index=0 第一行的路径是qemu的安装路径, 注意空格用`代替. 再用powershell运行一下这个脚本即可, 若提示禁止运行脚本则给一下脚本运行权限即可. 下一步是ssh到Phoenix虚拟机上, 配置脚本中"hostfwd=tcp:127.0.0.1:2222-:22"指定了虚拟机监听本机的127.0.0.1:2222端口, 如果你使用普通虚拟机, 则直接ssh到这个端口即可, 可以ssh -p2222 user@localhost , 用户名和密码都是user, 配置环境到这里就结束了. 但如果你跟我一样使用的是WSL2, 并且没有升级到Win11所以WSL没有固定的ip地址, 那还需要再操作一下. 打开Powershell输入Get-NetIPInterface, 找到vEthernet(WSL), 记下前面的ifIndex, 然后在刚才的脚本前面加上两句. $WSL_ip = (Get-NetIPAddress -InterfaceIndex 76 -AddressFamily Ipv4).IPAddress $WSL_ip += ":2222" Get-NetIPAddress的文档: https://learn....

March 28, 2023 · 1 min · 95 words · JuicyMio

当DEBUG无参数启动时, 我们在debug什么?

0x00 前言 好奇无参数启动debug时, debug在对什么程序进行debug, 于是进行一番探究. 0x01 过程 查了一堆类似"What DEBUG for DOS debug without parameters", “What DEBUG open by default"之类的问题, 没找到什么答案, 搜索的过程感觉在考古, 有用信息较少. 尝试用-u指令反汇编阅读代码, 看不出什么有用信息. 然后尝试二分法寻找指令段的结尾, 也没找到什么有用信息. 在这个过程中发现add [BX+SI], AL指令对应的机器码是0000. 尝试将整个程序dump下来, 没找到怎么dump. 于是再次返回搜索引擎, 仔细阅读Debug (command) - Wikipedia, 找到了这段, 他的第一句话看起来有用: When DEBUG is started without any parameters the DEBUG prompt, a “-” appears. The user can then enter one of several one or two-letter subcommands, including “A” to enter the assembler mode, “D” to perform a hexadecimal dump, “T” to trace and “U” to unassemble (disassemble) a program in memory....

March 25, 2023 · 2 min · 251 words · JuicyMio

[BUUCTF]others_shellcode wp

0x00 前置知识 x86_32下应用程序调用系统调用的过程: 把系统调用号存入eax. 把函数参数存在其他寄存器(ebx, ecx, edx, esi, edi), 当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在 ebx 中保存指向该内存区域的指针. 触发0x80中断, 切换到内核态, 执行中断处理函数. (为了节约宝贵的中断号, Linux用int 0x80触发所有系统调用. 再为每个系统调用分配与中断号用法类似的系统调用号) 0x01 题目分析 IDA看到main函数里只执行了一个getShell()函数, 代码如下. int getShell() { int result; // eax char v1[9]; // [esp-Ch] [ebp-Ch] BYREF strcpy(v1, "/bin//sh"); result = 11; __asm { int 80h; LINUX - sys_execve } return result; } 插入了汇编代码int 0x80. 根据IDA的注释可以看到eax的值就是result的值11. 而32位下系统调用号11即为execve. 32位调用参数存在栈里, 此处即为栈顶的v[1]内的"/bin/sh". 所以相当于手动调用了系统调用execve("/bin/sh").

March 16, 2023 · 1 min · 59 words · JuicyMio