某安全竞赛题一

前段时间一个比较大的比赛上遇到的两个题目,遂记录一下

运行改程序

 

该程序开启的端口为12345


发送畸形数据包之后程序崩溃,如下图可知,崩溃点发生在函数0x000000000040096b中

通过调试发现溢出发生在函数calc的memcpy函数中


 

溢出之后的堆栈,此时返回地址0x7fffffffc320被覆盖

 

通过查看即看发现溢出点的偏移为280

 

构造shellcode发包

 

内存中收到的shellcode

 

但是在该题中传入的shellcode会在传入溢出点之前被做加密处理,如下图所示,收取的数据在传入calc前,在函数EncodeBuffer中进行加密。

 

如下图所示即为处理过的shellcode,这样被传入的shellcode就不会被触发。

 

但是通过调试发现该处的加密处理是可逆的,即如果传入的是加密处理的shellcode,在服务端如果再进过加密处理,即会还原。

首先发送正常的shellcode

 

运行之后加密,可以从内存中dump出加密之后的shellcode。

 

此时再发送加密shellcode即会还原。

此时收到的shellcode即为加密shellcode。

 

双重加密之后还原的shellcode

   

溢出前的堆栈

 

溢出后此时返回地址0x7fffffff328被覆盖。

 

此时eip已可控。

 

 

 

                                                                   。。。。。。。。

 

此题为简单的溢出,但是在溢出前对传入的数据进行了加密,因此需要对传入的shellcode进行编码处理,当是此处的加密函数可逆,因此可以不必去逆向整个加密函数,通过取巧传入加密之后的shellcode即可绕过该处加密。

posted @ 2015-06-02 17:38  goabout2  阅读(166)  评论(0编辑  收藏  举报