今日份学习清单:get到两个新函数__ROL4__()函数和GetStdHandle()函数,循环右移和左移
1、查壳:
无壳32位程序
2、IDA启动:
打开主函数进行分析:
可以看到此处有一个GetStdHandle()函数
HANDLE WINAPI GetStdHandle(
_In_ DWORD nStdHandle
);
GetStdHandle()函数:
检索指定标准设备的句柄(标准输入、标准输出或标准错误)
GetStdHandle 返回的句柄可供需要在控制台中进行读取或写入的应用程序使用。 创建控制台时,标准输入句柄是控制台输入缓冲区的句柄,而标准输出和标准错误句柄则是控制台的活动屏幕缓冲区的句柄。 这些句柄可供 ReadFile 和 WriteFile 函数使用,也可供访问控制台输入缓冲区或屏幕缓冲区的任何控制台函数(例如 ReadConsoleInput、WriteConsole 或 GetConsoleScreenBufferInfo 函数)使用。
可以为下面的输入输出做准备
GetStdHandle 函数 - Windows Console | Mi
crosoft Learn
我们点开其中的可以发现里面有好长的字符,我们可以猜测他输入了一些数据
我们继续分析其他函数,4010F0这个函数,他的作用是检查最后一个字符是不是回车什么的,如果是我们就结束输入进行判断,下面的if语句里面是进行加密的,分析一下:
可以看到最后是一个异或比较,所以倒推找其进行修改的地方
可以发现有一个_ROL4_函数,先分析一下这个函数:
3、_ROL4_()函数
_ROL4_函数 的功能是循环左移,位移时最高位不舍弃,将最高位挪回最低位 比如二进制数据 10000,循环左移2位后得到00010
两个参数,第一个参数是要进行左移的数据,第二个是要进行移位的长度
同时我们也可以类比一下ROR4函数,就是循环右移函数,使用和上面一样
对于这个题目,就是将-2147024896循环左移4位,然后再右移一位,我们可以看看他的值
首先这个值是0x80070000
接着循环左移4位:0x700008 (因为是16进制,移动一位就是移动二进制的四位)
最后右移一位:0x380004
所以这个v4=0x380004
接着倒序进行异或,进行一次循环然后将v4开始改为其输入的值
4、解密脚本:
flags=[0]*40
x=-2147024896
tmp=0x380004
data2=[0x0D, 0x26, 0x49, 0x45, 0x2A, 0x17, 0x78, 0x44, 0x2B, 0x6C,
0x5D, 0x5E, 0x45, 0x12, 0x2F, 0x17, 0x2B, 0x44, 0x6F, 0x6E,
0x56, 0x09, 0x5F, 0x45, 0x47, 0x73, 0x26, 0x0A, 0x0D, 0x13,
0x17, 0x48, 0x42, 0x01, 0x40, 0x4D, 0x0C, 0x02, 0x69,0x00]
for i in range(len(data2)-1,-1,-1):
flags[i]=(data2[i]^tmp)&0xff
tmp=flags[i]
for i in range(len(data2)):
print(chr(flags[i]),end='')
答案:R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com手动加上flag
flag{R_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com}
至此完成,通过此题,要学会到进行逆向时要注重细节,不要放过这些仅仅只有一个表达式的函数,而且我们也要多认识一些这样的函数