2022DASCTF X SU 三月春季挑战赛 easyre

2022DASCTF X SU 三月春季挑战赛 easyre_第1张图片

有壳aspack,一般遇到都是upx,网上搜了aspack脱壳工具都没脱成功,使用手脱

手脱aspcak

打开od

下面使用ESP定律法进行脱壳

2022DASCTF X SU 三月春季挑战赛 easyre_第2张图片

push压栈了2022DASCTF X SU 三月春季挑战赛 easyre_第3张图片,我们观察到esp中的值变红了,改动了。

在内存窗口中转到

2022DASCTF X SU 三月春季挑战赛 easyre_第4张图片

下这个地址下硬件断点

运行软件,断到了。

2022DASCTF X SU 三月春季挑战赛 easyre_第5张图片

 接着f7

2022DASCTF X SU 三月春季挑战赛 easyre_第6张图片

pop出栈,我们发现有个大规模跳转,应该就是oep了

2022DASCTF X SU 三月春季挑战赛 easyre_第7张图片

2022DASCTF X SU 三月春季挑战赛 easyre_第8张图片

 调用api,是oep

准备dump一下

使用Lord Pe

2022DASCTF X SU 三月春季挑战赛 easyre_第9张图片

 先修正大小,然后dump

2022DASCTF X SU 三月春季挑战赛 easyre_第10张图片

 这个时候,我们还不能打开,还没修复IAT

2022DASCTF X SU 三月春季挑战赛 easyre_第11张图片

 打开后吧oep的偏移地址放入

2022DASCTF X SU 三月春季挑战赛 easyre_第12张图片

 2022DASCTF X SU 三月春季挑战赛 easyre_第13张图片

 获取表函数。无效的就删,然后点击修复文件,把之前dump出的文件就行修复

RVA不讲

已经脱掉了

2022DASCTF X SU 三月春季挑战赛 easyre_第14张图片

 用ida打开,直接f5

2022DASCTF X SU 三月春季挑战赛 easyre_第15张图片

 2022DASCTF X SU 三月春季挑战赛 easyre_第16张图片

 base58解码后发现是假的,直接不看

2022DASCTF X SU 三月春季挑战赛 easyre_第17张图片

 2022DASCTF X SU 三月春季挑战赛 easyre_第18张图片

 这个就是真的。

直接看加密函数,很麻烦,直接动调

构造42位input2022DASCTF X SU 三月春季挑战赛 easyre_第19张图片

lobyte是取地位的意思,我们跑起来后直接进这个地址找流秘钥

2022DASCTF X SU 三月春季挑战赛 easyre_第20张图片

 每4位取1,直接取,然后写exp

2022DASCTF X SU 三月春季挑战赛 easyre_第21张图片

#include
#include
int main()
{
	int v2[42];
	v2[0] = -61;
	  v2[1] = -128;
	  v2[2] = -43;
	  v2[3] = -14;
	  v2[4] = -101;
	  v2[5] = 48;
	  v2[6] = 11;
	  v2[7] = -76;
	  v2[8] = 85;
	  v2[9] = -34;
	  v2[10] = 34;
	  v2[11] = -125;
	  v2[12] = 47;
	  v2[13] = -105;
	  v2[14] = -72;
	  v2[15] = 32;
	  v2[16] = 29;
	  v2[17] = 116;
	  v2[18] = -47;
	  v2[19] = 1;
	  v2[20] = 115;
	  v2[21] = 26;
	  v2[22] = -78;
	  v2[23] = -56;
	  v2[24] = -59;
	  v2[25] = 116;
	  v2[26] = -64;
	  v2[27] = 91;
	  v2[28] = -9;
	  v2[29] = 15;
	  v2[30] = -45;
	  v2[31] = 1;
	  v2[32] = 85;
	  v2[33] = -78;
	  v2[34] = -92;
	  v2[35] = -82;
	  v2[36] = 123;
	  v2[37] = -84;
	  v2[38] = 92;
	  v2[39] = 86;
	  v2[40] = -68;
	  v2[41] = 35;
	  int v3[42]={56 ,120 ,221 ,232 ,0 ,175 ,191 ,58 ,107 ,251 ,184 ,12 ,133 ,53 ,92 ,173 ,230 ,0 ,224 ,138 ,29 ,189 ,70 ,210 ,43 ,0 ,21 ,36 ,198 ,173 ,161 ,201 ,123 ,18 ,40 ,0 ,5 ,0 ,114 ,62 ,16 ,161	
	  };
	  int i;
	  char flag[42];
	  for(i = 0;i<42;i++)
	  {
	  	flag[i] = (v2[i]-71)^v3[i];
	  	printf("%c",flag[i]);
	  }
	  
}
 

解决

你可能感兴趣的:(逆向使用心得,c++,c语言)