前言
-
比赛时候没能做出来,其实这道题就是一道pwn题。后面与p w n师傅讨论分析EXP分析还原了解题过程。学到了很多,也希望分享给大家。
-
抓包或者看源码就会发现有一个SSRF,但是没有权限读flag,测试发现存在一个readflag的elf文件。
-
读取题目全部源码:
backend.php
index.php
计算偏移
-
我们知道system函数的地址,我们就可以将open函数的地址替换为
system
函数的地址,我们在file_get_contents
传入参数为系统命令实际执行的却是system函数,这样我们将readflag的结果输出到文件,或者反弹shell。这样我们下一步就是要计算open函数在二进制文件中的实际偏移,最后直接修改内存。 -
这里需要用到
/proc/self/exe
在Linux2.2的内核及其之后,/proc/pid/exe是直接执行的二进制文件的符号链接.这个符号链接能够被取消.尝试打开这个文件就相当与打开了二进制文件,甚至可以通过重新输入/proc/pid/exe重新运行一个对应于pid的二进制文件.在一个多线程的程序中,如果主线程已经退出了,就无法访问这个符号链接.
在Linux2.0及其之前,/proc/pid/exe是指向当前进程执行的二进制文件.
-
同样我们之间将其搞下来,用下面脚本来计算open函数的偏移。
修改进程内存
/proc/self/mem是进程的内存内容,通过修改该文件相当于直接修改当前进程的内存。该文件不能直接读取,需要结合maps的映射信息来确定读的偏移值。即无法读取未被映射的区域,只有读取的偏移值是被映射的区域才能正确读取内存内容。
-
也就是说我们刚才从maps和动态链接库计算出system的地址需要修改mem来使得open的地址变成system的地址。既然我们偏移地址和文件偏移都算出来了直接构造payload即可。
backend.php?readfile=/readflag>/tmp/i_o_u_hlq&writefile=/proc/self/mem&buffer=%90%65%f8%f5%ff%7f&offset=15333784
-
直接读取
/tmp/i_o_u_hlq
就可以直接getflag
-
Nu1L 西湖论剑wp
-
https://blog.spoock.com/2019/10/08/proc/
-
https://www.pianshen.com/article/4537767804/