BUUCTF-re-[GXYCTF2019]luck_guy 前言:上个星期去写了科技协会的招新ctf题目。re勉强写,有些没写出来😥。
misc很简单导致自己写misc冲分上瘾(?这是招新题好吧)
1. 检查信息没有问题,放进ida64
2. main函数里出现了个红框
重点是这个红框,本地动态分配失败。让我有些搞不懂,但是好像不影响题目。
3. 用shift+f12,很容易就能找到关键的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 unsigned __int64 get_flag () { unsigned int v0; char v1; signed int i; signed int j; __int64 s; char v6; unsigned __int64 v7; v7 = __readfsqword(0x28 u); v0 = time(0L L); srand(v0); for ( i = 0 ; i <= 4 ; ++i ) { switch ( rand() % 200 ) { case 1 : puts ("OK, it's flag:" ); memset (&s, 0 , 0x28 uLL); strcat ((char *)&s, f1); strcat ((char *)&s, &f2); printf ("%s" , &s); break ; case 2 : printf ("Solar not like you" ); break ; case 3 : printf ("Solar want a girlfriend" ); break ; case 4 : v6 = 0 ; s = 0x7F666F6067756369 LL; strcat (&f2, (const char *)&s); break ; case 5 : for ( j = 0 ; j <= 7 ; ++j ) { if ( j % 2 == 1 ) v1 = *(&f2 + j) - 2 ; else v1 = *(&f2 + j) - 1 ; *(&f2 + j) = v1; } break ; default : puts ("emmm,you can't find flag 23333" ); break ; } } return __readfsqword(0x28 u) ^ v7; }
随机0~199,进入5个case,还得按顺序进对的,确实是luckyguy了。2,3的case是无用的。
看case4,似乎是把s赋值给f2。case5中f2还要再处理一遍,1是把f1,f2拼在一起。所以应该是先4再5,1.
4. 写python脚本。(难在自己写脚本,不过这个只需要按着改就行了,好耶)
1 2 3 4 5 6 7 8 9 10 11 f1='GXY{do_not_' f2=[0x69 ,0x63 ,0x75 ,0x67 ,0x60 ,0x6f ,0x66 ,0x7f ] f3='' for i in range(len(f2)): if (i % 2 ==1 ): f2[i] -= 2 else : f2[i] -= 1 for i in range(len(f2)): f3+=chr(f2[i]) print(f1+f3)
实测GXT需要改成flag
搞定!