分你所享、信息共享、轻松分享
来自民间的思想 | 送人玫瑰,手有余香。

没事儿下个副本吧?逆向新手踩坑指南

*本文原创作者:antiuto,本文属FreeBuf原创奖励计划,未经许可禁止转载
老规矩,坐下,打开电脑,最好能泡一杯茶,手边再放一个肉夹馍。。。 由于上一次吃过没查壳的亏,所以这次要先看一看有没有壳,用PEiD打开看一看: image.png 很好,没有壳,先直接运行看一看,找一找关键字符串: image.png 这样,我们就有了关键字符串,直接IDA打开(一定要先用IDA打开,高手都是这样的,即使不是,也要假装是),然后通过IDA的字符串查看功能(shift+F12)来找我们需要的字符串: image.png 除了我们想要的字符串还有满满的意外收获,先等等再说,直接双击“welcome to zsctf”,然后按下X,通过交叉引用来到了我们想要的函数: image.png 这是函数最开始反编译以后的样子,很多函数名称不是很友好,在这里,我想很多老师傅应该都会上手修改函数名称,改成对人阅读友好的名字,举个例子,第9行和第10行一眼就能看出来这是C里面的printf函数,这里,单击一下这个函数,然后按下n,就会跳出来修改函数名称的窗口: image.png 直接修改为printf,ok以后,就能看到所有函数名称一样的地方全部变成了我们修改的字样: image.png 通过不断地双击函数,查看函数的功能,修改函数或者变量的名称,最终修改函数名称变成了这个样子: image.png 第17行的函数进入以后是这个样子的: image.png 好多函数,不可能一一分析,那么猜测应该是花指令,这段代码有可能是对输入进行判断也有可能是处理输入字符串,等等再说,先看后面的函数。从第14行我们能得到输入的字符串长度是24,第20行应该是对处理过的字符串进行验证,只能是0-9,a-f。会不会是进行了md5加密?不管他,后面还有一个关键的函数,check。进入check函数以后,这个check卡了我很长时间,很长时间,有多久往下看: BOOL __cdecl sub_463480(int a1) { int v1; // ST18_4 int v2; // ST18_4 BOOL result; // eax int v4; // ST18_4 int v5; // [esp+D8h] [ebp-38h] int v6; // [esp+E4h] [ebp-2Ch] int v7; // [esp+F0h] [ebp-20h] int v8; // [esp+FCh] [ebp-14h] int v9; // [esp+108h] [ebp-8h] v9 = 0; v6 = 0; v5 = 0; while ( 2 ) { v1 = v9++; if ( v1 >= 12 ) return v5 == 311; if ( (unsigned __int8)sub_45B1C7() ) j__exit(0); v2 = *(char *)(v6++ + a1); switch ( v2 ) { case 48: v8 = 0; goto LABEL_12; case 49: v8 = 1; goto LABEL_12; case 50: v8 = 2; goto LABEL_12; case 51: v8 = 3; goto LABEL_12; case 52: v8 = 4; LABEL_12: v4 = *(char *)(v6++ + a1); switch ( v4 ) { case 53: v7 = 5; goto LABEL_25; case 54: v7 = 6; goto LABEL_25; case 55: v7 = 7; goto LABEL_25; case 56: v7 = 8; goto LABEL_25; case 57: v7 = 9; goto LABEL_25; case 97: v7 = 10; goto LABEL_25; case 98: v7 = 11; goto LABEL_25; case 99: v7 = 12; goto LABEL_25; case 100: v7 = 13; goto LABEL_25; case 101: v7 = 14; goto LABEL_25; case 102: v7 = 15; LABEL_25: switch ( byte_541168[v8] ) { case 100: sub_45CC4D(&v5, byte_541168[v7] - 48); continue; case 108: sub_45D0A3(&v5, byte_541168[v7] - 48); continue; case 114: sub_45CB0D(&v5, byte_541168[v7] - 48); continue; case 117: sub_45D0E9(&v5, byte_541168[v7] - 48); continue; default: result = 0; break; } break; default: result = 0; break; } break; default: result = 0; break; } return result; } }