Tags: excellent_crackme rev
Rating:
## 1. Download File
We can download "VolgaCTF_excel_crackme.xlsm" file.
![Download Challenge File](http://about.pwnable.me/CTFtime/0.png)
-----
## 2. Open File
You can use the Excel to open the file.
![Open File](http://about.pwnable.me/CTFtime/1.png)
When the file was opened, a warning about the macro appeared and i try to access the VBA script.
But... I don't know password.
![I don't know password ...](http://about.pwnable.me/CTFtime/2.png)
-----
## 3. Extract the Script
So I extracted the VBA script, using OfficeMalScanner.exe.
```
OfficeMalScanner.exe VolgaCTF_excel_crackme.xlsm info
OfficeMalScanner.exe VolgaCTF_excel_crackme.xlsm inflate
OfficeMalScanner.exe vbaProject.bin info
```
I try to read script, but it is really hard...
![Script](http://about.pwnable.me/CTFtime/3.png)
So I use VBA code Indenter.
[VBA Code Indenter ](https://www.automateexcel.com/vba-code-indenter/)
It is much easier to read using the Code Indenter.
![indented Script](http://about.pwnable.me/CTFtime/4.png)
While reading the script, I found that the script was accessing a specific Cell.
I check Excel VolgaCTF_excel_crackme.xlsm's "Лист1" Sheet Again and Found huge int table .
![i found the 45 * 46 int_table](http://about.pwnable.me/CTFtime/5.png)
-----
## 4. Solution
VBA Script check the flag like my own python psuedocode.
![How does a script check the flag?](http://about.pwnable.me/CTFtime/6.png)
```python
import sys
int_table = [
[620,340,895,-39,945,321,586,487,-935,-641,-233,553,546,389,764,-199,577,-539,547,-50,134,-722,134,571,629,-775,499,-633,-928,-103,975,961,-275,136,165,170,257,559,-656,-207,403,-414,371,885,-885,490493],
[-19,85,-456,228,-127,-777,191,605,292,-181,-652,801,-801,-890,-75,214,22,-52,-4,750,678,-300,82,965,-889,-342,933,736,-677,945,-191,408,-96,916,-739,454,-941,72,414,-373,150,-535,742,-376,-285,-7845],
[598,357,236,8,-163,787,-996,26,-685,257,-620,-959,340,-530,-621,634,-701,-112,737,-781,66,517,566,-915,907,-818,-487,-82,-115,313,414,836,774,-776,-551,920,-548,898,-198,244,822,-741,-185,-589,202,-54593],
[967,-357,-421,-752,-315,413,991,350,873,-122,12,-463,-942,576,657,-108,-375,481,622,-550,-910,167,-184,-392,-111,457,-606,31,-350,583,-716,57,985,842,222,605,-239,-250,280,579,-109,-297,-99,-222,605,210672],
...
...
...
]
flag = input()
for i in range(len(flag)) :
flagsum = 0
for j in range(len(flag)) :
int_element = int_table[i][j]
flag_element = ord(flag[j])
flag_sum = flag_sum + int_element * flag_element
if flag_sum != int_table[i][45] :
print("Bad... Try Again!")
sys.exit()
```
I wrote python code(use z3), i can't get flag. but mementomori helped me.
He wrote the python code, and we could get the flag.
```python
from z3 import *
data = [map(int, _.strip().split('\t')) for _ in open('data.txt').readlines()]
flag = [Int('flag{}'.format(i)) for i in range(45)]
s = Solver()
for line in data:
eq = 0
sol = line[-1]
for i, x in enumerate(line[:-1]):
eq += x * flag[i]
s.add(eq == sol)
if s.check() == sat:
print(''.join([chr(s.model()[x].as_long()) for x in flag]))
```