---
# System prepended metadata

title: Writeup RE + MISC

---

# Writeup RE + MISC
## BabyRE
Sử dụng DiE (Detect-It-Easy) để phân tích file --> **PE32**
Check main 
![](https://i.imgur.com/1w54inG.png)
>tự hiểu
sub_401020 = printf 
sub_401050 = scanf

![](https://i.imgur.com/8VYokz3.png)
Dựa vào ảnh, ta có thể thấy giá trị của eax là `var_28`, nhấn vào thì thấy `var_28` là một xmmword, có khả năng `var_28` là **xmmword_41B6E0** (giá trị gán cho v8)
![](https://i.imgur.com/64JMF6K.png)

![](https://i.imgur.com/poJtjem.png)
![](https://i.imgur.com/sn4vFUP.png)

Vậy là khẳng định được giá trị của `var_28` chính là **xmmword_41B6E0**
--> Việc cần làm là tìm giá trị trên vùng **xmmword_41B6E0** 

Mặt khác, trở lại phần nhập v12 
![](https://i.imgur.com/wWlQKli.png)
Ta có hhd là 1 byte (giá trị  từ -127 đến 128) --> nhập 5 số có giá trị từ -127 đến 128 trong file `.exe`

Tiếp đến đọc đến phần input đầu vào 
![](https://i.imgur.com/daagNEX.png)

- Dòng 23 + 24 cho thấy:
```
v5[0] = v8[j] ^ v12[j%5]
```
- Dòng 25 + 26 cho thấy: 
```
v5[1] = v12[j -5(&v8 + j+1-&v8)/5+1] ^ v8[j+1] = v12[j - 5(j+1)/5 +1] ^ v8[j+1] = v12[(j+1)%5] ^ v8[j+1]
```
Tóm lại, code lại đơn giản như sau
```c
for(int j = 0; j<26; j++)
    v8[j] ^= v12[j%5];
```
trở lại với IDA, ta thấy ![](https://i.imgur.com/V4CcQpt.png)

`Guest your flag. The flag will be of the form flag{[1-zA-Z0-9]+}`
Dựa vào form dễ thấy 5 char đầu của flag lag `flag{` trong khi v12 cũng có 5 giá trị

Viết code dịch ngược:
```python=1
find = open("input.txt", "r", encoding='utf-8')
fout = open("output.txt", "w", encoding='utf-8')

data = find.readlines()
s = 'flag{'
input = []
for i in range(len(s)):
    input.append(chr(ord(s[i])^(int(data[i], 16))))

for i in range(len(input)):
    fout.write(str(ord(input[i])) +'\n')

find.close()
fout.close()
```
với file input.txt chứa các byte (dạng hex) của data
Sau khi chạy thu được: 
```python=
4
8
15
23 
42
```
### flag{easy_baby_challenge}
## HiddenTreasure
File zip cho ta 2 file bao gồm 1 file .bmp và 1 file .exe
Dựa vào việc .bmp ta có thể đoán được đây là 1 file ảnh được hiển thị bằng các bit lưu trữ (bitmap)
Ném file HiddenTreasure.exe vào IDAPro và để ý 1 chút:

![](https://i.imgur.com/oQRPXlb.png)

Dễ thấy argv[2] dùng cho CreateFileW dùng để tạo (hoặc mở file) --> khả năng argv[2] ~ (ảnh gì đó quên tên rồi).bmp nên ta dự đoán argv[1] liên quan đến flag 

Dựa vào code đọc được, ta có thể thấy code ảnh hưởng trực tiếp đến file ảnh là `v26[2* v21+ v21]=v22` (v26 ~ v17 ~ IpBaseAddress[v14] <-- v13)

Dễ thấy v21 là biến không đổi (v19 không đổi, i_Width, i_v9 là số vòng lặp phụ thuộc vào flag. Mà flag không đổi nên i_v9 không đổi suy ra v21 không đổi)

Ngoài ra v22 cũng không đổi (cứ lằng nhằng họ hàng nhà chúng nó ra đến cái đầu là hiểu)

--> Tìm tất cả mảng v22 =))

Điều cần làm là 
```c=1
cout<<int((int8_t)BitmapData[2 * v21 + v21])<<endl;
```
(in ra giá trị đúng của v26[2* v21+v21])

Code:
```c=1
#include <bits/stdc++.h>
#include <windows.h>
#include <windef.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define el '\n'
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MaxN = 1e6 + 1e5;
const int mod = 1e9 + 7;
int TEST = 1;
#define MAXSIZE 100
char PointerAddress[1000000];
char ssss[100000];
char ggg[] = "C:\\Users\\DELL\\Desktop\\reverse\\inside-the-mind-of-a-hacker-memory.bmp";
void solve()
{
  cin >> ssss;
  unsigned int Destination_length;
  HANDLE File_Write_Handle;
  void *v5;
  HANDLE FileMappingW_Handle;
  void *v8;
  unsigned int i_Destination;
  unsigned int i_v9;
  char v12;
  const void *v13;
  DWORD DataOffset;
  unsigned int v15;
  int ImageWidth;
  char *v17;
  int i_Height;   
  int v19;       
  int i_Width;  
  int v21;   
  char v22;   
  HANDLE v23;  
  HANDLE hObject;
  int v25;     
  char *BitmapData;
  int ImageHeight;
  char *PointerAddress;
  byte *input_byte;
  DWORD picture_SIZE;
  int v31;
  unsigned int v32;
  int v33;
  char Destination[256];
  {
    memset(Destination, 0, sizeof(Destination));
    wcstombs(Destination, (const wchar_t *)ssss, 0x100u);
    Destination_length = 256;
    if (Destination_length)
    {
      File_Write_Handle = CreateFileW(L"C:\\Users\\DELL\\Desktop\\reverse\\inside-the-mind-of-a-hacker-memory.bmp", 0xC0000000, 1u, 0, 3u, 0x80u, 0);
      v5 = File_Write_Handle;
      v23 = File_Write_Handle;
      if (File_Write_Handle != (HANDLE)-1)
      {
        picture_SIZE = GetFileSize(File_Write_Handle, 0);
        if (picture_SIZE == -1 || (FileMappingW_Handle = CreateFileMappingW(v5, 0, 4u, 0, 0, 0),
                                   v8 = FileMappingW_Handle,
                                   (hObject = FileMappingW_Handle) == 0))
        {
          CloseHandle(v5);
          return;
        }
        PointerAddress = (char *)MapViewOfFile(FileMappingW_Handle, 6u, 0, 0, 0);

        if (PointerAddress)
        {
          byte *v9 = (byte *)malloc(8 * Destination_length);
          i_Destination = 0;
          input_byte = v9;
          i_v9 = 0;
          v32 = 0;
          do
          {
            v12 = Destination[i_Destination];
            v9[i_v9] = v12 & 1;
            v9[i_v9 + 1] = (v12 >> 1) & 1;
            v9[i_v9 + 2] = (v12 >> 2) & 1;
            v9[i_v9 + 3] = (v12 >> 3) & 1;
            v9[i_v9 + 4] = (v12 >> 4) & 1;
            v9[i_v9 + 5] = (v12 >> 5) & 1;
            v9[i_v9 + 6] = (v12 >> 6) & 1;
            i_Destination = v32 + 1;
            v9[i_v9 + 7] = (v12 >> 7) & 1;
            i_v9 += 8;
            v32 = i_Destination;
          } while (i_Destination < Destination_length);
          v13 = PointerAddress;
          {
            DataOffset = *(int *)(PointerAddress + 10);
            if (DataOffset < picture_SIZE && i_v9 < *(int *)(PointerAddress + 34))
            {
              v15 = 0;
              ImageWidth = *(int *)(PointerAddress + 18);
              ImageHeight = *(int *)(PointerAddress + 22);
              v17 = &PointerAddress[DataOffset];
              i_Height = 0;
              v25 = ImageWidth;
              BitmapData = v17;
              *((int16_t *)PointerAddress + 3) = i_v9;
              v33 = 0;
              if (i_v9)
              {
                v19 = 0;
                v31 = 0;
                do
                {
                  if (i_Height >= ImageHeight)
                    break;
                  i_Width = 0;
                  if (v15 < i_v9)
                  {
                    do
                    {
                      if (i_Width >= ImageWidth)
                        break;
                      v21 = v19 + i_Width++;
                      v22 = input_byte[v15++];
                      cout << int((int8_t)BitmapData[2 * v21 + v21]) << endl;
                      v19 = v31;
                      ImageWidth = v25;
                    } while (v15 < i_v9);
                    i_Height = v33;
                  }
                  ++i_Height;
                  v19 += 3 * ImageWidth;
                  v33 = i_Height;
                  v31 = v19;
                } while (v15 < i_v9);
                v13 = PointerAddress;
              }
              v9 = input_byte;
            }
          }
          free(v9);
          UnmapViewOfFile(v13);
          CloseHandle(hObject);
          CloseHandle(v23);
        }
        else
        {
          CloseHandle(v8);
          CloseHandle(v5);
        }
      }
    }
  }
  return;
}
signed main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  freopen("C:\\Users\\DELL\\Desktop\\reverse\\inside-the-mind-of-a-hacker-memory.bmp", "rb", stdin);
  freopen("output.txt", "w", stdout);
  while (TEST--)
    solve();
}

```
Sau khi chạy chương trình, ta check file `output.txt` và để ý đề bài có liên quan đến bitmap --> chỉ chọn những số 0 và 1, sau đó ghép lại thành 1 byte --> chuyển qua ascii

Hoặc có thể chuyển hết những ký tự 0 và 1 trong file cho vào file `decode.txt` và chạy file python sau:
```python=1
fout = open("flag.txt", "w")
finp = open("decode.txt","r")
i = 0
ans = []
c = ''
while True:
    line = str(finp.readline())
    if (line == ''):
        break
    i = i+1
    if i==8:
        i = 0
        c = c + line[:-1]
        ans.append(c)
        c = ''
    else:
        c = c + line[:-1]

for s in ans:
    fout.write(str(chr(int(s[::-1],2))))
finp.close()
fout.close()
```
Và flag sẽ nằm trong `flag.txt`
### flag{d0nt_f0rget-th3_treasur3}