R0 CREW

CrackMe's from MIEM StartCTF

Пара крякмисов с прошедшего соревнования. Pirate полегче, crack посложнее. Нужно обойти антиотладочные приемы и приемы антистатики, заполучив флаг. Для ца соревнования задания оказались слишком сложными, поэтому выкладываю их сюда на ваш суд :slight_smile:

А будет решение для crack?

  1. Patch
bb = open('crack.exe','rb').read()
o = bb[:0x152f2] + '\xbc\x1e\x49\x00' + bb[0x152f6:]
open('crack_p.exe','wb').write(o)
  1. Run
  2. Have profit!

А можно для полного нуля пояснить что тут произошло и почему:oops:

В исходном коде

.text:00491EF1                 push    offset ptrString ; <<<<<<<<<<<<<<< string pointer
.text:00491EF6                 push    offset byte_5C51D0
.text:00491EFB                 call    sub_481AF6

при старте выводится строка ‘It seems that there is nothing interesting here…’
Патчем подменяем указатель на строку, указателем на буфер, где будет находиться распакованный флаг
.text:00491EBC FlagBuffer db 27h, 7Fh, 56h, 7Bh, 6Ch, 7Bh, 2Ah, 56h, 6Ch, 27h, 70h …
Адрес этого буфера в little-endian и есть содержание нашего патча ‘\xbc\x1e\x49\x00’.

Или питоном можно весь алго курить, кроме получения CRC

b = open('crack.exe','rb').read()
xx = b[0x152bc:0x152ef]
crc = 0x10
o = ''
for i in range(len(xx)):
  o += chr((ord(xx[i])-7)^crc)

print o

Приветствую! Хотел бы спросить, если тема еще жива, как решается pirate?
Самое смешное, что crack решил без проблем, а на pirate застрял, хотя, вроде бы, должно быть наоборот

Флаг нужно брутить.

#.rdata:00F23170 
t = [78, 62, 8, 43, 15, 8, 109, 14, 124, 10, 100, 100, 13,
125, 77, 42, 32, 6, 25, 61, 98, 82, 110, 10, 56, 71,
60, 111, 115, 29, 6, 4, 74, 90, 1, 36, 102, 24, 13,
4, 81, 89, 69, 58, 88, 59, 70, 121, 66, 16, 68, 30,
17, 96, 41, 57, 69, 122, 93, 22, 128, 90, 93, 47, 128,
24, 31, 50, 21, 115, 102, 28, 54, 66, 73, 56, 65, 126,
88, 65, 4, 99, 93, 19, 67, 86, 127, 4, 18, 93, 71, 81,
53, 26, 109, 29, 13, 61, 101, 71, 24, 56, 79, 48, 85,
39, 107, 36, 90, 92, 36, 115, 39, 0, 69, 25, 125, 118,
86, 53, 91, 52, 65, 14, 105, 14, 68, 87, 110, 71, 40,
119, 123, 76, 50, 85, 88, 65]
# .rdata:00F231FC 
m = [90, 66, 73, 90, 47, 85, 88, 88, 80, 61, 112, 26, 54,
80, 112, 23, 125, 112, 39, 85, 55, 88, 26, 124, 80,
85, 88, 80, 20, 112, 26, 9, 47, 112, 108]

for i in xrange(35):
  f = ''
  for j in xrange(128):
    try:
     p = j ^ t[j+10]
     if m[i] == p ^ t[p+10]:
        f += chr(j)
    except:
     pass
  print i, f

Будет множество коллизий

0 MS
1 <I
2 E
3 MS
4 '),l{
5 7:
6 0]
7 0]
8 _
9 m
10 34
11 n
12 y
13 _
14 34
15 Wx
16 c
17 34
18 bp
19 7:
20 18
21 0]
22 n
23 5
24 _
25 7:
26 0]
27 _
28 h
29 34
30 n
31 d
32 '),l{
33 34
34 }

по которым уже флаг нужно собрать вручную
MIEM{700_m4ny_3xc3p710n5_70_h4ndl3}