-
-
2023年初级逆向工程师面试题分析笔记 代码还原
-
2024-6-2 05:05
8910
-
这是一年前的一个初级逆向面试题,题目比较简单,对于刚刚学习逆向的新手练习还是不错的
比较可恶的事情就是我做完了题目,告诉我需要去实地面试
![](upload/attach/202406/891053_7E7FZ26FHNVJJTA.webp)
MFC的程序,下面使用xspy进行定位按钮的代码 001429B0经过验证 这个就是按钮响应函数
![](upload/attach/202406/891053_NZUH8WYFKURR5QA.webp)
经过分析,第三个push是要计算的值 也就是seed
![](upload/attach/202406/891053_QZJ83AMNWUK5UNN.webp)
第一个push是返回值 也就是key
![](upload/attach/202406/891053_RMDKEBZNFDVQWJU.webp)
上图的call dword ptr ds:[edx] 就是算法函数 下面就是算法函数的实现,可以发现它还有一个参数ecx
![](upload/attach/202406/891053_TVFGYMEJRSB376C.webp)
函数中有使用到ecx+4 ecx+8 ecx+c 这三个值是不固定的,需要寻找算法
通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法
![](upload/attach/202406/891053_WA6797VCW4DSJ45.webp)
下面是我进行还原的算法,本题是可以直接扣汇编的,由于题目要求,我还原为了C++代码
#include "stdafx.h"
#include "windows.h"
unsigned char ecx4 = 0;
unsigned char ecx8 = 0;
unsigned char ecxC[0x100] = { 0 };
void InitializeKey(unsigned int a2, unsigned int a3)
{
for (unsigned int i = 0; i < 0x100; i++)
{
ecxC[i] = i;
}
unsigned int var_4 = 0;
for (unsigned int i = 0; i < 0x100; i++)
{
unsigned char eax = (*(((unsigned char*)&a2) + (i % a3)) + var_4);
var_4 = (ecxC[i] + eax) % 256;
unsigned char Temp = ecxC[i];
ecxC[i] = ecxC[var_4];
ecxC[var_4] = Temp;
}
}
int ObtainingResults(unsigned int arg_0,unsigned int arg_4,unsigned char* arg_8)
{
int i = 0;
for (int i = 0; i < 4; i++)
{
ecx4 = (ecx4 + 1) % 256;;
ecx8 = (ecxC[ecx4] + ecx8) % 256;
unsigned char esiTemp = ecxC[ecx8];
ecxC[ecx8] = ecxC[ecx4];
ecxC[ecx4] = esiTemp;
unsigned char edx = (ecxC[ecx4] + ecxC[ecx8]) % 256;
arg_8[i] = *((unsigned char*)&arg_0 + i) ^ ecxC[edx];
}
return 0;
}
int main()
{
unsigned int nInput = 123;
InitializeKey(nInput,4);
unsigned char ret[4] = { 0 };
ObtainingResults(nInput,4,ret);
printf("%u\r\n",*(unsigned int*)ret);
system("pause");
return 0;
}
![](upload/attach/202406/ZNKS8EFUDAWJHMK.jpg)
![](upload/attach/202406/AGM98MP7EMMD5NC.jpg)
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2024-6-2 05:07
被旺仔_小可爱编辑
,原因: