首页
社区
课程
招聘
[原创]【CTF-PWN】pwnable.tw_calc
发表于: 2018-6-6 09:33 9063

[原创]【CTF-PWN】pwnable.tw_calc

2018-6-6 09:33
9063

首先运行一下
了解到这个程序大概类似计算器,计算我们输入的一个合法表达式的值
载入IDA分析:

可以看到这里关键处:

可以看到函数开始:

可以看到这里启用了canary保护
将内存large gs:14h中的(随机值)入栈
并在程序返回前对canary值进行检验:

canary值在栈中位于返回地址和函数调用参数之间
从而保护了栈内数据,防止我们修改返回地址造成栈溢出

canary入栈后calc调用了bzero:

这里从ebp+s开始将一段长为0x400的空间清零

开辟一段数据后
calc调用了get_expr函数

跟进get_expr后发现一堆判断跳转
大致过程:

接下来calc调用init_pool:

init_pool:

很简短的一个过程:

接下来calc调用 parse_expr函数:

可以看到其参数:

首先F5分析一下parse_expr的伪代码(分析在注释处):

除此之外,这里调用了eval函数来进行计算:

可以看到:

在parse_expr中分析:
正常情况下最终应该在a2[1]处的值为结果
可当考虑到第一个字符即为运算符的情况下:
例如:+10

同样地:

这里注意:

我们查看一下程序的保护机制:

发现:

这里开启了NX保护
我们无法在栈上执行shellcode拿到shell
同时看到这里:


程序是静态链接
我们这里考虑利用ROP调用sys_execve来获得shell

首先计算出返回地址与*a2的距离

故而:

我们最终需要:

我们需要构造一段栈内数据:

利用ROPgadget找到我们需要指令的地址:


下面:

注意:
其中/bin/sh字符串我们只知道其在栈中的相对地址,这里需要我们先取得main函数的ebp地址(我们取得+360(main函数基地址)是负数,需要+0x100000000转换后运算,再在最后-0x100000000修改对应位置值)

在main中:

故而返回地址即在:

而后再根据我们最后在栈内构造的字符串"/bin/sh"与返回地址的相对位置计算出字符串"/bin/sh"的地址即可

 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-2-2 13:51 被admin编辑 ,原因: 图片本地费
上传的附件:
  • calc (724.61kb,18次下载)
收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 1622
活跃值: (223)
能力值: ( LV8,RANK:135 )
在线值:
发帖
回帖
粉丝
2
init_pool这段代码的逻辑应该是将ebp+var_4开始的0x64长度的内存清零才对吧。当i=0x63的时候会将a1[i + 1]给置零。

2020-1-12 14:25
0
游客
登录 | 注册 方可回帖
返回
//