-
-
除数不能为0异常处理
-
发表于: 2019-6-15 14:51 2423
-
1:断点
字符串success!(方法1:看到最开头的error 就想到了success 方法二:代码内容很少随便一看就能看到)
2:流程进入
只有触发异常处理才有可能成功,仅仅是有可能。
如下图:
3:确认进入异常处理就100%成功。
在代码最开始稍微往下随便一点地方下个断点,完了之后,修改eip的值为 0x0040137c,然后跑起来直接就输出success
从这里可见,只要进入异常就一定成功
.text:00401379
.text:00401379 loc_401379:
.text:00401379 ; __except(loc_401373) // owned by 401342
.text:00401379 mov esp, [ebp+ms_exc.old_esp]
.text:0040137C lea edx, [ebp+var_3C]
4:偷懒看伪代码先确认几点条件。
if ( v4 < 7 && v14 == 51 && v13 == 53 && v12 == 51 && v11 + v10 + v9 == 149 )
{
v6 = 0;
if ( v4 )
{
do
v3 = *(&v9 + v6++) + 16 * v3 - 48;
while ( v6 < v4 );
}
由此可见:
A: a1 a2 a3 51 53 51
B: a1 + a2 + a3 = 149
C: 伪代码
int ret = 0;
int i = 0;
for(i = 0; i < 6;++i)
ret = a(i) + 16*ret - 48;
这个ret满足什么条件是最重要的,浪费了很多时间在这个上面,通过跟踪如下图
当然这里一定马上要想到div这个很特殊,小学学的(除数,被除数,我傻傻总分不清怎么叫,反正就是下面的那个不能为0,如果为0触发异常)
既ret = esi = 上面call loc_401354的压栈值 = 0x401353
5:代码输出
好了条件都全了,暴力枚举一下,python不熟,很丢人,上c
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char a[6];
int ret = 0;
a[3] = 51;
a[4] = 53;
a[5] = 51;
for(a[0] = 1; a[0] < 150; a[0]++)
{
for(a[1] = 1; a[1] < 150; a[1]++)
{
for(a[2] = 1; a[2] < 150; a[2]++)
{
if ((a[0] + a[1] + a[2]) == 149)
{
ret = 0;
for( int i = 0; i < 6 ; i++)
ret = a[i] + ret * 16 - 48;
if (ret == 0x401353)
{
printf("%c%c%c353\n",a[0],a[1],a[2]);
}
}
}
}
}
puts("ok");
return 0;
}
输出结果为:
1c353
2R353
3A!353
401353
5A353
6Q353
可见字符实验了
3A!353和
401353都可以。
不太懂ctf规则,可能只允许数字吧,所以输入了
401353就成功了哦。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: