首页
社区
课程
招聘
除数不能为0异常处理
发表于: 2019-6-15 14:51 2423

除数不能为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直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//