[NSSRound#V Team]Shatter_Time Wp

如题,今天写了一下NSS上的一道逆向题,觉得挺有意思的,记录一下
下载附件,发现为32位文件,扔进ida中,打开字符串页面分析:

发现线索字符串,跟进查看。打开后发现enter前有许多未识别的字符,在option->general->string中将编码方式改为CP969,按A键识别出中文:

推测好耶即为获得正确flag,跟踪发现在main2中,查找引用main2的函数,找到主函数main5:

非常简单的逻辑。
main66函数即为产生随机数的一个函数,每次用户按下enter后,程序根据运行的时间返回一个值
而main1函数则是验证该数是否正确的函数,如果x % i始终等于给定数组中的元素值,那么该数正确

第一步我们先求出正确的数,直接使用脚本爆破即可:

list = [0x000000A6, 0x000001A3, 0x000000B6, 0x000001CA, 0x000000F2,
        0x00000024, 0x0000015A, 0x000000A1, 0x000001EE, 0x0000014A,
        0x000000B0, 0x00000020, 0x0000019A, 0x0000011F, 0x000000AE,
        0x00000047, 0x000001EE, 0x0000019C, 0x00000154, 0x00000116,
        0x000000E2, 0x000000B8, 0x00000098, 0x00000082, 0x00000076,
        0x00000074, 0x0000007C, 0x0000008E, 0x000000AA, 0x000000D0,
        0x00000100, 0x0000013A, 0x0000017E, 0x000001CC, 0x0000000E,
        0x0000006F, 0x000000DA, 0x0000014F, 0x000001CE, 0x0000003C,
        0x000000CE, 0x0000016A, 0x00000210, 0x000000A1, 0x0000015A,
        0x0000021D, 0x000000C8, 0x0000019E, 0x0000005A, 0x00000143]

for num in range(10000000):
        for i in range(500,550):
                if ( num % i != list[i-500]):
                        break;
        if ( i == 549 ):
                break;
print(num)

求出正确数字为:1376666

而主函数中的main2函数是负责通过对字符串进行相应处理,最后输出flag。由于其中需要将得到的正确数字作为地址,所以我们直接动调将正确数字喂给程序即可:

在main66中的随机数产生出下断点,动态调试

clock函数产生的随机数存放在eax寄存器中,我们只要将eax寄存器中的函数值修改为正确数字即可(右键eax寄存器->modify value)
运行得到flag:NSSCTF{F_tern@l&ing3nuOus}

posted @ 2024-05-30 21:28  Ve2n0uth  阅读(6)  评论(0编辑  收藏  举报