rsp

点击此处获得更好的阅读体验


WriteUp来源

来自官方发布

https://www.xctf.org.cn/library/details/5acdc1c31cf4935ac38fce445978888a5710cf11/

题目考点

  • powerpc架构

  • 流量分析

  • gdb server调试

解题思路

根据提示,使用gdb连接此端口

可以看到该目标是powerpc架构的,默认的gdb可能不支持连接此架构,需要支持多架构的gdb

可以进行continue操作,可以Ctrl-C在运行过程中进行中断

可看到两个地址比较奇怪,高位不同,低位是一样的,再来抓包看一下连接的的情况

可以看到服务端支持读取auxv,查看目标auxv

auxv出来的结果也都很奇怪 可以随便找几个数字查看二进制表示,可以发现左边有几个1,右面大段全是0,猜测是大小端错误 powerpc应为大端架构,设置之后再查看auxv就正常了

尝试从内存中dump出来ELF镜像,发现一次读取太多会导致连接中断:

尝试一次读取一页:

合并内存文件得到一个ELF文件,使用IDA打开,通过查看字符串可知,该ELF程序具有调试器实现,应该跟我们连接的程序是同一个。

查看栈回溯:

使用IDA查看其中的0x100027a8地址

可以看到这里是fork的一个子进程在做死循环,只是简单地打印了信息。 分析到这里,我们目前所具有的条件就很清楚了,我们连上了一个gdbserver的实现,该gdbserver挂到了自己fork出的子进程上,我们可以进行常规的调试操作。 flag应该是在一个文件中。常规的思路是我们直接写入读取文件的shellcode,不过其中的系统调用方面可能比较麻烦,尤其是这还是不常见的powerpc架构。 我们可以看一下程序本身有没有可以借助的部分。在导入函数中搜索open,可以看到程序导入了fopen函数

转到fopen函数的调用处,可以看到一个完整的打开文件读取内容的函数

这里读取的是auxv文件的内容,不过我们可以方便地通过调试修改读取的文件名,进而获取其中的内容。完整过程如下:

得到flag

Flag

1
flag{Gd6s3rv3r@frOm_5cr4tch}