关于逆向
查看原帖
关于逆向
224978
optimize_2楼主2022/4/14 17:48

如题,这道题的 subtask 3,求的是 nπ\sqrt{\large\frac{n}{\pi}},但是我使用 ida pro 打开后,伪代码如下:

int D::Do()
{
  int v1; // [esp+28h] [ebp-20h] BYREF
  int v2; // [esp+2Ch] [ebp-1Ch]
  _TBYTE v3; // [esp+30h] [ebp-18h]

  scanf("%d", &v1);
  if ( pre && (v1 <= 0 || v1 > 50000) )
    return puts("invalid input.");
  *(double *)&v3 = sqrtl((double)v1 / -8.87960937049345e43);
  v2 = (int)floorl(*(long double *)&v3);
  return printf("%d\n", v2);
}

可以发现,π\pi 应该在的地方变成了 -8.87960937049345e43

除完之后会变成负数,自然不能开平方,所以按照伪代码看,这段程序无法运行。

然后我运行了 lost.exe,发现他正确给出了结果。

然后我就打开了 GDB 硬调,发现执行完这一句之后,v1 确实被除了 π\pi

然后给我整不明白了,是浮点数存储的原因呢,还是 ida pro 出问题了呢

2022/4/14 17:48
加载中...