0x01.解题思路
1.用IDA分析函数,搞清思路
1,执行程序,得到的flag是个乱码
2,直接用IDA查看反汇编代码,分析代码
- 看到第16行代码,输出flag,lpMem中保存着flag值。
- 第8行代码,为lpMen申请内存空间。
- 第9行代码,为lpMem赋值。其中&unk_409B10的值为
- 从第13行代码我们知道,第10~15行代码在对lpMem操作,又因为 ExitProcess(0xFFFFFFFF);所以猜测,这段if结构没有执行(执行的话,就会直接退出,不会有跳出MessageBox对话框)
3,所以我就可以猜测如果这个if执行,会不会就能输出正确的flag。if里面只有一个函数sub_401000,双击进入
可以看到sub_401000这个函数就是一个加密或者解密的函数,肯定是与正确的flag有关的函数,所以我们要让这个函数执行
4,可以看到正常情况下,我们会跳转到loc_4010B9,去执行MessageBoxA显示乱码。我们要执行sub_401000就必须把jz short loc_4010B9改为jz short loc_401096,并且要把int 3这个断点改为nop,让程序执行sub_401000
2.用OD动态分析,调试函数
1,单步运行执行汇编指令,找到程序跑飞的位置(关键语句),跟进查看进行了什么操作,运行到00E512AC,用F7单步步入
2,如图执行到if跳转指令处对应的汇编代码时,就要开始修改指令让函数跳转到loc_401096,执行sub_401000
修改跳转地址让程序得到正确的flag
参考:https://www.52pojie.cn/thread-1103194-1-1.html
https://blog.csdn.net/qq_43786458/article/details/102150779
0x02.Windows API函数
1,HeapAlloc:是一个Windows API函数。它用来在指定的堆上分配内存,并且分配后的内存不可移动
返回值:指向被分配的内存块的指针
参考:HeapAlloc()
HeapAlloc与malloc的区别
2,HeapCreate:这个函数创建一个只有调用进程才能访问的私有堆。进程从虚拟地址空间里保留出一个连续的块并且为这个块特定的初始部分分配物理空间。HeapCreate(),返回值:一个指向新创建的堆的指针
3,IsDebuggerPresent函数:可以用来检测本进程是否处于被调试状态,当然,这种方法的实用性不大 链接
4,ExitProcess :结束调用的进程及其所有的线程 ,和exit()函数类似 退出函数exit VS ExitProcess
5,MessageBoxA(hwnd,text文本内容,title标题,按钮类型)
HeapCreate:创建堆栈
HeapAlloc:在堆上分配内存
memcpy_s:内存拷贝函数
IsDebuggerPresent():检测调试器,成功返回1,失败返回0。
ExitProcess:退出进程
MessageBoxA:弹窗口
HeapFree:释放堆内存
HeapDestroy:销毁堆