码迷,mamicode.com
首页 > 其他好文 > 详细

攻防世界--crackme

时间:2019-09-10 20:51:47      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:media   this   ref   idt   strlen   获取信息   lease   alt   gets   

测试文件:https://adworld.xctf.org.cn/media/task/attachments/088c3bd10de44fa988a3601dc5585da8.exe

 

1.准备

技术图片

获取信息

  1. 32位文件
  2. 北斗压缩壳(nsPack)

 

1.脱壳

1.1 OD打开(esp定律法)

技术图片

 

技术图片

Word或者DWord都可以

 

技术图片

 

技术图片

点击确认就行。

 

这样我们的断点就下好了,直接F9运行到断点即可。

技术图片

选择OllyDump插件进行脱壳。

技术图片

将文件重命名就可以了。

 

技术图片

 

1.2 软件脱壳法

这个没什么讲究,拖进去脱壳就行

技术图片

 

不过这个方法有个缺点是文件有损坏

技术图片

 

可以使用ImportREC进行修复

技术图片

 

2.IDA打开

 1 int __cdecl main(int argc, const char **argv, const char **envp)
 2 {
 3   int result; // eax
 4   int v4; // eax
 5   char Buf; // [esp+4h] [ebp-38h]
 6   char Dst; // [esp+5h] [ebp-37h]
 7 
 8   Buf = 0;
 9   memset(&Dst, 0, 0x31u);
10   printf("Please Input Flag:");
11   gets_s(&Buf, 0x2Cu);
12   if ( strlen(&Buf) == 42 )
13   {
14     v4 = 0;
15     while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] )
16     {
17       if ( ++v4 >= 42 )
18       {
19         printf("right!\n");
20         goto LABEL_8;
21       }
22     }
23     printf("error!\n");
24 LABEL_8:
25     result = 0;
26   }
27   else
28   {
29     printf("error!\n");
30     result = -1;
31   }
32   return result;
33 }

 

3.代码分析

通过第42行代码,可以了解到flag长度为42

 

通过第15行代码,我们知道输入的正确flag与byte_402130[v4 % 16]进行异或等于dword_402150[v4],这个v4就是一个数组下标,最大为41

.nsp0:00402130 byte_402130     db t                  ; DATA XREF: _main:loc_40107F↑r
.nsp0:00402131 aHisIsNotFlag   db his_is_not_flag,0

实际上就是"this_is_not_flag"

 

.nsp0:00402150 dword_402150    dd 12h                  ; DATA XREF: _main+8D↑r
.nsp0:00402154                 dd 4, 8, 14h, 24h, 5Ch, 4Ah, 3Dh, 56h, 0Ah, 10h, 67h, 0
.nsp0:00402184                 dd 41h, 0
.nsp0:0040218C                 dd 1, 46h, 5Ah, 44h, 42h, 6Eh, 0Ch, 44h, 72h, 0Ch, 0Dh
.nsp0:0040218C                 dd 40h, 3Eh, 4Bh, 5Fh, 2, 1, 4Ch, 5Eh, 5Bh, 17h, 6Eh, 0Ch
.nsp0:0040218C                 dd 16h, 68h, 5Bh, 12h, 2 dup(0)
.nsp0:00402200                 dd 48h, 0Eh dup(0)
.nsp0:0040223C                 dd offset dword_403000
.nsp0:00402240                 dd offset dword_4022B0
.nsp0:00402244                 dd 1, 53445352h, 41D713B4h, 4CDD5318h, 12DCFFBAh, 0D5AF8709h
.nsp0:00402244                 dd 1

这段数字实际上就需要42个。

 

3.脚本获取

byte_402130 = "this_is_not_flag"
dword_402150 = [ 0x12, 4, 8, 0x14, 0x24, 0x5C, 0x4A, 0x3D, 0x56, 0x0A, 0x10, 0x67,
0, 0x41, 0, 1, 0x46, 0x5A, 0x44, 0x42, 0x6E, 0x0C, 0x44, 0x72, 0x0C, 0x0D,
0x40, 0x3E, 0x4B, 0x5F, 2, 1, 0x4C, 0x5E, 0x5B, 0x17, 0x6E, 0x0C, 0x16, 0x68,
0x5B, 0x12, 0, 0, 0x48 ]

x = ‘‘

for i in range(0,42):
    x += chr(dword_402150[i]^ord(byte_402130[i%16]))

print(x)

技术图片

 

4.get flag!

flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}

攻防世界--crackme

标签:media   this   ref   idt   strlen   获取信息   lease   alt   gets   

原文地址:https://www.cnblogs.com/Mayfly-nymph/p/11502686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!