ichunqiu圣诞欢乐赛babyre
程序关键函数在此
此处是一些有关于多线程的函数,正好借此机会学习一下,顺便学习了一下多线程调试文章如下
https://bbs.pediy.com/thread-254194.htm
多线程
CreateThread函数为创建线程,创建线程成功即运行这个线程。
其中第三个参数为指向线程函数的指针
第四个参数为向线程函数传递的参数
WaitForSingleObject函数为挂起运行的该线程,使等待对象的对象变为有信号状态。
知道了这些就可以静态分析程序了
程序流程
程序首先创建了第一个线程,该线程进行了反调试,如果处于调试状态则会触发非法地址异常。
之后又创建了一个线程,并且将这个线程单独运行了0xffffff秒,该线程为打印和输入,但是如果调试该线程因为printf打印的地址为无效地址会触发异常导致程序无法正常运行。。该部分静态看即可。静态也可以分析出,输入的值被存放在了lparameter变量上
随后又创建并单独运行了一个线程,该线程的函数参数为之前输入的值,该线程即为加密线程了。进入该线程,但是该线程有一处retn会返回到非法内存地址,把retn给nop掉即可,加密流程全程不复杂,首先判断flag格式是否为flag:{}之后对输入进行了加密和比较
关键加密函数如下
写出解密代码即可
#include<stdio.h>
#include<windows.h>
int main()
{
BYTE arr[16] = { 0x17,0x83,0xe7,0x45,0x85,0x66,0xe6,0xf5,0x97,0x56,0x23,7,5,0xe2,2,2 };
for (int i = 0; i < 0x10; i++)
{
arr[i] ^= 0x10;
}
for (int i = 0; i < 0x10; i=i+2)
{
printf("%c",((arr[i] & 0XF) << 4) + ((arr[i + 1] & 0xf0) >> 4));
printf("%c",((arr[i + 1] & 0xf) << 4) + ((arr[i] & 0xf0) >> 4));
}
system("pause");
}