boston-key-party-2016-pwn-simple_calc 题解

本文详细分析了2016年Boston Key Party CTF中的一道pwn题Simple_Calc。程序为64位小端程序,存在缓冲区溢出漏洞,由于开启NX保护,利用方式为构造ROP链。在理解程序功能和内存分配后,通过控制输入触发溢出,并在每次菜单调用中逐步写入ROP链,最终通过memcpy执行ROP链,实现系统调用获取shell。
摘要由CSDN通过智能技术生成

文件信息

该样本来自2016年boston-key-party ctf的一道pwn题–simple_calc
检查样本信息:
  只开启了NX保护,64位小端程序
checksec

漏洞定位

将样本拖入IDA进行分析时,会发现text段特别多,仔细分析后会发现很多函数都没有被使用,写完wp后,我猛然发现引用这么多看似无用的text段,其实是为了引用更多的gadget,方便后面ROP链的构造。好的,废话不多说,进行漏洞分析。
分析main函数,可以发现该样本是一个菜单题,先要求输入计算的次数,输入的次数必须大于3小于等于255,正确输入后会以该值作为菜单功能循环的次数。这里直接展示程序的运行截图,如下图所示:
pro
初步了解程序功能后,我们再详细的分析一下IDA中的伪代码,如下图所示,初次输入的值存入v24变量中,然后程序会以4倍该值的大小分配一个内存块,v25变量指向该内存地址。
main_pre
接着看一下switch语句,和程序功能运行截图一样,有加减乘除以及退出5个功能,且每个功能执行后都将一个dword四字节大小的值赋值给了v25+4*i的内存位置。然后注意一下memcpy函数,其中第一个参数v22变量位于栈空间,v25是分配的堆空间,4*v24是拷贝的内存大小,我们可以控制v24的大小造成缓冲区溢出。
switch
最后我们分析一下菜单函数的具体功能,具体分析后我们可以发现每个函数实现方式都大同小异,区别在于变量的存放位置和加减乘除运算。这里我们对比上面的switch分支语句分析add函数,其余函数类同,可以发现之前拷贝到v25+4*i内存地址的值是这里加法运算后的结果dword_6CA88,该变量位于bss段,是全局变量,还有一点值得注意的是,加法的两个操作数不能小于0x27。
add

利用分析

经过上面的分析,我们已经发现了一个溢出漏洞,以及可以通过每次菜单功能的调用实现一次内存写。如果该题目没有开启NX保护的话,我们可以采用写入shellcode的方式,但由于开启了NX保护,所以采用构造ROP链的方式。即构造ROP链,通过程序的每次计算将ROP链的地址写入到内存中,最后退出时执行memcpy实现缓冲区溢出,执行ROP链,实现execve("/bin/sh", NULL, NULL)的系统调用。这里对于如何控制寄存器实现系统调用原理不熟悉的读者可以参考这篇博文。另外寻找gadget采用的是ROPgadget工具,不了解的读者可以百度一下。

wp

from pwn import *

# c
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值