前段时间一个比较大的比赛上遇到的两个题目,遂记录一下
运行改程序
该程序开启的端口为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即可绕过该处加密。
时间: 2024-10-07 13:32:15