首页
社区
课程
招聘
2023年初级逆向工程师面试题分析笔记 代码还原
2024-6-2 05:05 3425

2023年初级逆向工程师面试题分析笔记 代码还原

2024-6-2 05:05
3425

这是一年前的一个初级逆向面试题,题目比较简单,对于刚刚学习逆向的新手练习还是不错的

比较可恶的事情就是我做完了题目,告诉我需要去实地面试

MFC的程序,下面使用xspy进行定位按钮的代码 001429B0经过验证 这个就是按钮响应函数

经过分析,第三个push是要计算的值 也就是seed

第一个push是返回值 也就是key 

上图的call dword ptr ds:[edx] 就是算法函数 下面就是算法函数的实现,可以发现它还有一个参数ecx

函数中有使用到ecx+4 ecx+8 ecx+c 这三个值是不固定的,需要寻找算法

通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法

下面是我进行还原的算法,本题是可以直接扣汇编的,由于题目要求,我还原为了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;
}


















[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2024-6-2 05:07 被旺仔_小可爱编辑 ,原因:
上传的附件:
收藏
免费 4
打赏
分享
最新回复 (16)
雪    币: 198
活跃值: (256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Besttwuya 2024-6-3 05:33
2
0
前段时间,我也面试这家公司,一样的面试题.
雪    币: 1541
活跃值: (2573)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
旺仔_小可爱 2024-6-3 12:00
3
0
Besttwuya 前段时间,我也面试这家公司,一样的面试题.[em_1]
我看了一下 他们已经不招聘了 最后活跃时间几个月前
雪    币: 198
活跃值: (256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Besttwuya 2024-6-3 13:41
4
0
还有招人,我也是简单,线上面试一下。
雪    币: 1541
活跃值: (2573)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
旺仔_小可爱 2024-6-4 01:36
5
0
Besttwuya 还有招人,我也是简单,线上面试一下。
那有可能是不同公司 用的一个题
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_qhtgvshx 2024-6-5 10:09
6
0
“通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法” 请问 这里是如何通过内存写入断点定位到的ecx初始化表算法的?
雪    币: 378
活跃值: (3020)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
appview 2024-6-5 11:06
7
0
xspy是什么工具,有下载链接吗?
雪    币: 2294
活跃值: (1024)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chased 2024-6-5 17:46
8
0
mb_qhtgvshx “通过多次调用算法函数发现ECX的值是固定的,使用内存写入断点即可定位到ecx的算法” 请问 这里是如何通过内存写入断点定位到的ecx初始化表算法的?
不一定要内存断点,设硬件写入断点也能断下在密码表初始化的地方。不知道为啥我设内存断点就会报异常,硬件断点就不会
雪    币: 8
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_qhtgvshx 2024-6-5 18:09
9
0
chased 不一定要内存断点,设硬件写入断点也能断下在密码表初始化的地方。不知道为啥我设内存断点就会报异常,硬件断点就不会
那请问硬件断点怎么下呢 ? 我的意思是怎么找到ecx初始化表算法
雪    币: 2294
活跃值: (1024)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chased 2024-6-5 20:07
10
0
mb_qhtgvshx 那请问硬件断点怎么下呢 ? 我的意思是怎么找到ecx初始化表算法
因为ecx是个固定值,密码表结果存在ecx+c的位置,你先找到ecx的值,往后加c个字节,就是存表的指针,存的是个内存地址,你在内存窗口跳到那个内存地址上,下硬件写入断点就能断下
雪    币: 287
活跃值: (513)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
dkxzl 1 2024-6-6 09:46
11
0
还记得多年前面试了一个逆向岗位,也是一上来就发一个程序过来要你逆算法,然后我一看好家伙算法还是VM的,一看岗位工资2-3W
雪    币: 256
活跃值: (79)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
superkofzx 1 2024-6-6 18:53
12
0
写的很详细
雪    币: 198
活跃值: (256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Besttwuya 6天前
13
0
dkxzl 还记得多年前面试了一个逆向岗位,也是一上来就发一个程序过来要你逆算法,然后我一看好家伙算法还是VM的,一看岗位工资2-3W[em_27]
现在卷的厉害,动不动就是要求VM还原
雪    币: 18
活跃值: (999)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
0
dkxzl 还记得多年前面试了一个逆向岗位,也是一上来就发一个程序过来要你逆算法,然后我一看好家伙算法还是VM的,一看岗位工资2-3W[em_27]
道通科技。
雪    币: 614
活跃值: (1132)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
qqwawzymu 4天前
15
0
猪会被杀掉 道通科技。
道通现在都这么卷了?
雪    币: 642
活跃值: (3671)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
Lnju 1 4天前
16
0
https://github.com/yodamaster/xspy
雪    币: 966
活跃值: (586)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
木魚· 3天前
17
0
我好像也是这个面试,但好像又不一样,这个公司也挺离谱的  周一到周四加班3个小时,然后周六也是加班,加班没工资,长沙和深圳都有公司。
游客
登录 | 注册 方可回帖
返回