-
-
[原创]【CTF-PWN】pwnable.tw_calc
-
发表于:
2018-6-6 09:33
9063
-
[原创]【CTF-PWN】pwnable.tw_calc
首先运行一下
了解到这个程序大概类似计算器,计算我们输入的一个合法表达式的值
载入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编辑
,原因: 图片本地费