程序的功能是一个4*4的“rubik's square”游戏,有一个0x10大小的叫做__m128i的结构体。
程序的功能如下
其中有专门存放指令记录的地方,位于stack上,并且有记录code_num的变量,相对位置关系如下
漏洞点在如下位置
正常情况是将指令历史存入code_buffer位置,但是没有对code_num大小限制,导致可以溢出到code_num变量位置,更改code_num的信息,导致可以泄露更改stack上的信息。
思路:
exp如下:
程序给了,但是跑不起来,本地不能测试。
程序逻辑比较简单,是两次任意地址读和一次任意地址写,可以通过修改got表来获得更多次数的任意地址写权限。
通过这道题目可以学习一下怎么获得shell
这里我直接贴一下已经放出来blog的解答思路
首先是这篇博客6e7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3N6s2u0Q4x3X3c8&6N6h3c8S2K9g2)9J5k6h3S2S2N6r3g2F1j5h3u0D9L8$3N6Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8Y4c8J5P5g2)9J5c8U0t1H3x3U0m8Q4x3V1j5H3x3W2)9J5c8U0l9$3i4K6u0r3x3e0x3H3y4e0f1I4i4K6t1K6M7s2N6F1i4K6u0V1y4o6V1I4M7s2c8K6i4K6u0V1g2r3S2A6L8X3E0Q4x3X3c8@1N6$3W2U0k6g2)9J5k6r3u0W2k6X3!0J5k6g2)9J5k6s2y4H3k6h3q4C8K9h3&6Y4i4K6u0V1L8$3&6U0k6b7`.`.
然后是这一篇博客f24K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2J5k6h3c8J5L8$3y4C8k6i4c8Q4x3X3g2U0L8s2g2T1i4K6u0r3x3U0l9J5x3q4)9J5c8U0l9J5i4K6u0r3x3o6c8Q4x3V1k6Z5j5h3y4C8N6r3@1J5x3q4)9J5k6s2c8Z5K9h3&6C8N6s2N6A6j5$3g2Q4x3V1j5`.
参考链接
007K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2J5k6h3c8J5L8$3y4C8k6i4c8Q4x3X3g2U0L8s2g2T1i4K6u0r3x3U0l9J5x3q4)9J5c8U0l9J5i4K6u0r3x3o6c8Q4x3V1k6Z5j5h3y4C8N6r3@1J5x3q4)9J5k6s2c8Z5K9h3&6C8N6s2N6A6j5$3g2Q4x3V1j5`.
1d1K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3N6s2u0Q4x3X3c8&6N6h3c8S2K9g2)9J5k6h3S2S2N6r3g2F1j5h3u0D9L8$3N6Q4x3X3g2U0L8$3#2Q4x3V1k6W2L8Y4c8J5P5g2)9J5c8U0t1H3x3U0m8Q4x3V1j5H3x3W2)9J5c8U0l9$3i4K6u0r3x3e0x3H3y4e0f1I4i4K6t1K6M7s2N6F1i4K6u0V1y4o6V1I4M7s2c8K6i4K6u0V1g2r3S2A6L8X3E0Q4x3X3c8@1N6$3W2U0k6g2)9J5k6r3u0W2k6X3!0J5k6g2)9J5k6s2y4H3k6h3q4C8K9h3&6Y4i4K6u0V1L8$3&6U0k6b7`.`.
这道题目给了两处任意地址写的机会,并且提供了libc的地址,libc环境是2.29,2.29的vtable是具有写权限的。
99fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1k6h3q4E0M7X3!0U0K9$3g2@1K9i4y4@1i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6t1H3i4K6u0r3x3o6u0Q4x3V1j5H3y4g2)9J5c8W2m8%4L8W2)9J5k6p5S2S2j5$3E0f1e0g2)9J5k6o6t1H3x3U0m8Q4x3X3c8f1M7X3W2H3i4K6u0V1g2r3!0Q4x3X3c8f1M7X3W2U0K9#2)9J5c8W2!0q4z5q4!0n7c8W2)9&6z5g2!0q4y4q4!0n7z5q4!0m8b7g2!0q4y4g2)9^5c8q4)9&6b7g2!0q4y4g2!0m8c8g2!0m8x3W2!0q4z5q4!0m8c8g2!0n7x3q4!0q4y4g2!0n7c8q4)9&6y4g2!0q4y4q4!0n7b7g2)9^5y4W2!0q4z5q4!0m8c8W2!0m8y4W2!0q4y4#2!0n7b7W2)9^5y4W2!0q4y4#2)9&6b7g2)9^5y4q4!0q4z5q4!0m8y4#2!0m8x3#2!0q4z5g2!0m8x3W2)9&6z5q4!0q4z5q4!0n7c8W2)9^5y4#2!0q4y4#2!0m8z5q4)9^5b7W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4#2)9&6b7#2)9^5b7W2!0q4y4q4!0n7b7g2)9^5y4W2!0q4y4q4!0n7z5g2)9^5b7W2!0q4y4g2)9&6x3q4)9^5c8g2!0q4y4g2)9^5c8W2)9&6y4#2!0q4y4#2)9&6b7W2)9^5b7g2!0q4y4g2!0n7c8g2)9^5z5q4!0q4y4g2!0m8y4q4)9&6b7g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5q4)9^5x3q4)9^5x3#2!0q4y4W2)9&6c8W2!0m8y4g2!0q4y4#2)9^5x3W2!0n7z5g2!0q4y4q4!0n7z5q4!0n7b7W2!0q4z5q4!0m8y4W2)9^5x3g2!0q4y4W2)9&6z5q4!0m8c8X3k6U0L8r3!0K6k6g2)9J5z5q4)9J5z5g2!0q4y4g2)9^5y4#2!0n7c8q4!0q4y4W2)9&6y4g2!0n7x3q4!0q4z5q4!0m8y4#2!0m8y4W2!0q4y4g2)9^5c8W2)9&6x3g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4#2!0m8z5q4)9^5b7W2!0q4y4g2!0n7b7g2)9^5c8W2!0q4y4W2!0n7y4g2)9^5x3g2!0q4y4g2)9^5b7g2!0m8b7W2!0q4y4W2)9^5b7#2)9^5x3g2!0q4x3#2)9^5x3q4)9^5x3R3`.`.
本题目是可以修改vtable的值,利用fclose()控制程序流主要是如下源码
当调用setbuf关闭缓冲区之后,再次输入的时候将不会在heap区域分配空间当做缓冲区,其中IO_buf_base指向的是缓冲区起点,IO_buf_end指向的是缓冲区终点,关闭缓冲区之后,IO_buf_base 指向_IO_2_1stdin->shortbuf,位于stdin内部,保存\n或者\0,IO_buf_end=IO_buf_base+1。
我们修改_IO_2_1stdin->IO_buf_end,使其增大之后,便可以控制此缓冲区内部的内容,即输入时的内容都会先存储在当前的缓冲区内(libc空间)。
我最初还有一个疑问是,scanf("%llx %llx",&v4,&v5)正常来说是输入两个64位十六进制整数,在第二次输入时输入了长度很长的payload,不按照正常输入可以输入进去么? 经过程序测试的结果是,他会将输入的所有字符串先缓存在缓冲区内,然后按照格式解析给v4,v5,所以我们的payload是可以正常覆盖到libc上的。
解题思路:
之所以介绍这道题目,是因为这道题目最后的get shell方式也是通过fclose函数,本题目不可以在libc段写,但是可以再bss段写,我们可以在bss段伪造stderr,然后利用fclose(stderr)获得shell。
由于是伪造stderr,所以不同于上题目中利用_IO_FINISH (fp);来控制程序流,我们控制程序流的位置要稍微靠前一下,否则还要保证之前的功能可以正常,劫持程序流位置如下:
贴一下exp,感兴趣的可以自己去调试一下
题目进行了seccomp限制,但是rules未知,需要首先编写shellcode进行探测
得知seccomp限制条件如下
只允许read open 并且open的fd=3时,对于buffer值进行了规定,因此需要两次open,使得fd值为4
解题思路是第一步利用shellcode进一步扩大shellcode空间,可以输入更多的shellcode;然后利用侧信道攻击,将flag内容读取到内存中,然后利用汇编指令进行遍历比对,最终得到flag。
详见博客:dd7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5x3$3u0A6L8r3I4A6L8$3&6K6i4K6u0W2j5$3!0E0i4K6u0r3N6%4u0A6N6r3g2#2M7q4)9J5k6r3!0T1k6i4W2Q4x3X3c8@1K9r3g2Q4x3X3c8J5N6h3I4W2M7#2)9J5c8R3`.`.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!