Try   HackMD

Hack The Box - Reversing (Easy Part 2)

image

Ghi chú:

Difficulty: Easy

Challenge 8: You Cant C Me

Can you see me?

Download Challenge Here

Solution

Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

upload_fc4f1634c801c8c38671aeb1c26e2a51

Mở chương trình trong IDA.

upload_4bc4050f460867d1490de3a7ce38de7d

Bây giờ là lúc để khai thác nó.

arr = [0x6D, 0x5E, 0x26, 0x26, 0x66, 0x69, 0x17, 0x55, 0x6F, 0x26, 0x6B, 0x55, 0x5A, 0x27, 0x5A, 0x55, 0x59, 0x55, 0x63, 0x29]
result = ''.join(chr(x + 10) for x in arr)
print(result)
Flag: HTB{wh00ps!_y0u_d1d_c_m3}

Challenge 9: Baby Crypt

Give me the key and take what's yours.

Download Challenge Here

Solution

Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

upload_788391355d3a3331f8d27732f3f7f6ad

Mở chương trình trong IDA.

upload_b499fc1eca1152c17cf0315b458ee087

Bây giờ là lúc để khai thác nó.

arr = [0x3F, 0x64, 0x35, 0x0C, 0x48, 0x47, 0x05, 0x6F, 0x46, 0x04, 0x6F, 0x02, 0x04, 0x03, 0x13, 0x28, 0x52, 0x0E, 0x28, 0x58, 0x43, 0x0F, 0x00, 0x05, 0x56, 0x4D]
key = "w0w"
result = ''.join(chr(arr[i] ^ ord(key[i%3])) for i in range(26))
print(result)

HTB{x0r_1s_us3d_by_h4x0r!}

Challenge 10: Anti Flag

Flag? What's a flag?

Download Challenge Here

Solution

Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

image

Mở chương trình trong IDA.

upload_4e68cce84fe20bff6fa5b99f1de0e9a0

  • Việc thực thi tệp trả về No flag for you :(
  • Nếu trình gỡ lỗi phát hiện của nó trả về Well done!!.
  • Không có ích gì với những thứ này. Lựa chọn cuối cùng là đi sâu vào sub_13FF().

upload_b3f6b

upload_62c08

Đây là mã hóa RC4 với ciphertext = D0C0354F0CD9232A484B090B543CF8C0E5DFD7790F3DDB35C400key = 2asdf-012=14.

upload_7a979f688e418044e6717c4ebdb15bfc

Bạn cũng có thể vá tệp bằng đoạn mã IDAPython.

import ida_bytes
ida_bytes.patch_byte(0x14F4,0XEB)
ida_bytes.patch_byte(0x1510,0XEB)
Flag: HTB{y0u_trac3_m3_g00d!!!}

Challenge 11: IRCWare

During a routine check on our servers we found this suspicious binary, although when analyzing it we couldn't get it to do anything. We assume it's dead malware, but maybe something interesting can still be extracted from it?

Download Challenge Here

Solution

FoWnwoS

Mở chương trình trong IDA.

image

IDA là một công cụ disassembler rất tốt, nó đã cho ta biết được một số lệnh system call. Ta cũng có thể dùng LINUX SYSTEM CALL TABLE để biết cách syscall() thực hiện.

GY0d3RV

ttYgzIc

Hệ thống tạo một số ngẫu nhiên (4 byte) và thêm vào Nickware as Nick

Imgur

Imgur

Hàm sub_40028F(), chương trình giao tiếp với địa chỉ IP đã biết. Tuy nhiên push 100007Fh (IP)push 401Fh (port) chưa mang nhiều ý nghĩa lắm. Ta dùng CyberChef và nhận được IP=127.0.0.1 (localhost) and port=8000.

NeO148J

CQwM991

Chúng ta có thể tham gia vào giao thức IRC bằng cách sử dụng kênh “#secret”. Chúng tôi sẽ gửi tin nhắn trên máy khách để cung cấp cho chúng tôi một lá cờ. Chúng ta có thể thực hiện 3 hành động.

  • PRIVMSG #secret :@pass
  • PRIVMSG #secret :@flag
  • PRIVMSG #secret :@exec

Nó yêu cầu mật khẩu để có được cờ. Chúng tôi tìm thấy nó giải mã mật mã và so sánh mật khẩu.

RYhb6KN

Đó là ROT13 với số vòng quay = 9

Q8i8Ww8

Bây giờ chúng ta có thể gửi tin nhắn trên máy khách để cung cấp cho chúng ta một lá cờ.

iPTqZdn

Flag: HTB{m1N1m411st1C_fL4g_pR0v1d3r_b0T}

Challenge 12: Sekure Decrypt

Timmy created a secure decryption program

Download Challenge Here

Solution

Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

rEx2VzV

Chúng ta được cho một tệp core dump, một decrypt file và một source code file.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mcrypt.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>

int encrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len) {
  MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
  int blocksize = mcrypt_enc_get_block_size(td);

  if( buffer_len % blocksize != 0 ) { 
    return 1; 
  }

  mcrypt_generic_init(td, key, key_len, IV);
  mcrypt_generic(td, buffer, buffer_len);
  mcrypt_generic_deinit (td);
  mcrypt_module_close(td);
  
  return 0;
}

int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len) {
  MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
  int blocksize = mcrypt_enc_get_block_size(td);

  if( buffer_len % blocksize != 0 ){ 
    return 1;
  }
  
  mcrypt_generic_init(td, key, key_len, IV);
  mdecrypt_generic(td, buffer, buffer_len);
  mcrypt_generic_deinit (td);
  mcrypt_module_close(td);
  
  return 0;
}

void* read_file(char* filename, int len) {
  FILE *fp = fopen(filename, "rb");
  void* data = malloc(len);
  fread(data, 1, len, fp);
  fclose(&fp);
  return data;
}

int main(int argc, char* argv[]) // gcc src.c -o dec -lmcrypt -ggdb
{
  char* IV = "AAAAAAAAAAAAAAAA";
  char *key = getenv("KEY");
  int keysize = 16;
  char* buffer;
  int buffer_len = 16;

  void *ciphertext = read_file("flag.enc", buffer_len);
  decrypt(ciphertext, buffer_len, IV, key, keysize);
  printf("Decrypted contents: %s\n", ciphertext);

  return 0;
}

  1. Raw memory dump là bản sao hoàn chỉnh của nội dung bộ nhớ của máy tính tại một thời điểm cụ thể. Nó bao gồm tất cả các dữ liệu đang được sử dụng bởi hệ điều hành, chương trình đang chạy và dữ liệu khác được lưu trữ trong RAM. Nó không có header, metadata hay magic number.
  2. Segment fault: Đây là một loại lỗi bộ nhớ xảy ra khi một chương trình cố gắng truy cập một vùng nhớ mà nó không được phép truy cập. Điều này thường xảy ra do lỗi lập trình hoặc lỗi dữ liệu.
  3. Dump: Khi xảy ra lỗi, hệ thống có thể tạo ra một bản sao của nội dung bộ nhớ vào một tệp gọi là core dump. Core dump này chứa thông tin chi tiết về trạng thái của chương trình tại thời điểm xảy ra lỗi, giúp cho việc phân tích và khắc phục lỗi dễ dàng hơn.

Chương trình có IV = 16*"A" and key = lấy khóa từ biến môi trường. Đọc bộ đệm của flag.enc dưới dạng bản mã và giải mã để lấy nội dung giải mã. Hàm encrypt() và decrypt() là mã hóa AES

Chương trình đã gặp lỗi phân đoạn và để giúp việc phân tích lỗi dễ dàng hơn, hệ thống đã tạo ra một core dump chứa thông tin chi tiết về lỗi. Key đã được load vào trong chương trình cũng như một vài ciphertext được load cho tới khi crash.

Về cơ bản, ta có thể tìm key trong dump. Ta tìm được key = VXISlqY>Ve6D<{#F

MemlxS8

Mở chương trình trong IDA, chúng ta có thể thấy trạng thái được ghi lại của bộ nhớ làm việc. Ta sẽ có dữ liệu dưới dạng bản mã và ta cần xác định phần bù để giải mã. Với src.c, chúng ta có thể thấy rằng mỗi lần lấy 16 byte làm bộ đệm để mã hóa và buffer_encrypted cũng có 16 byte.

Ý tưởng của tôi là đọc từng byte 16 để giải mã, bruceforce cho đến khi chúng tôi tìm thấy mẫu cờ.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mcrypt.h>

#define BLOCK_SIZE 16
#define KEY_SIZE 16

void processFile(FILE *fp, char *IV, char *key);

int decrypt(void *buffer, int buffer_len, char *IV, char *key, int key_len) {
    MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
    int blocksize = mcrypt_enc_get_block_size(td);

    if (buffer_len % blocksize != 0) {
        return 1;
    }

    mcrypt_generic_init(td, key, key_len, IV);
    mdecrypt_generic(td, buffer, buffer_len);
    mcrypt_generic_deinit(td);
    mcrypt_module_close(td);

    return 0;
}

int main(int argc, char *argv[]) {
    char IV[] = "AAAAAAAAAAAAAAAA";
    char key[] = "VXISlqY>Ve6D<{#F";

    FILE *fp = fopen("core", "rb");

    if (fp == NULL) {
        perror("Error opening file");
        return 1;
    }

    processFile(fp, IV, key);
    fclose(fp);

    return 0;
}

void processFile(FILE *fp, char *IV, char *key) {
    fseek(fp, 0, SEEK_END);
    int fileSize = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    for (int x = 0; x < fileSize; x += BLOCK_SIZE) {
        void *ciphertext = malloc(BLOCK_SIZE);
        fread(ciphertext, 1, BLOCK_SIZE, fp);
        decrypt(ciphertext, BLOCK_SIZE, IV, key, KEY_SIZE);

        if (strncmp(ciphertext, "HTB{", 4) == 0) {
            printf("Decrypted contents (%d): %s\n", x, (char *)ciphertext);
            free(ciphertext);
            return;
        }

        free(ciphertext);
    }
}

qyw0y78

Flag: HTB{t1m_l3arn_C}

Challenge 13: Hissss

Download Challenge Here

Solution

Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

GKRThnH

Mở chương trình trong IDA. Chuỗi tìm kiếm, chúng tôi nhận được %s.pkg , %s%s%s.exe , %s.py

.pkg là phần mở rộng tên tệp được sử dụng cho một số định dạng tệp chứa các gói phần mềm và các tệp khác để được cài đặt trên một thiết bị, hệ điều hành hoặc hệ thống tập tin nhất định. Tôi đoán chương trình này chứa một số tệp có phần mở rộng tên tệp nối tiếp, đặc biệt là “auth.exe” , “ auth.py “ .

Tôi thực sự tin rằng nó chứa auth.py khi ta quan sát hàm sub_3F30(). Hơn nữa, chương trình còn đề cập đến _MEIPASS , một điều khá mới mẻ đối với tôi. Tìm kiếm nhanh cho tôi một số thông tin về _MEIPASS. Vì vậy trước hết chúng ta cần giải nén và dịch ngược mã python bằng PyInstaller ExtractorDecompyle++ hoặc Uncompyle6.

bUxwjQh

Ta đã dùng https://www.toolnb.com/tools-lang-en/pyc.html. Và đoạn code trở nên rất đẹp như sau:

import sys
password = input('Enter password> ')
if len(password) != 12:
    print("Sorry! You've entered the wrong password.")
    sys.exit(0)
if ord(password[0]) != 48 or password[11] != '!' or ord(password[7]) != ord(password[5]) or 143 - ord(password[0]) != ord(password[4]) or ord(password[1]) ^ ord(password[3]) != 30 or ord(password[2]) * ord(password[3]) != 5610 or password[1] != 'p' or ord(password[6]) - ord(password[8]) != -46 or ord(password[6]) ^ ord(password[7]) != 64 or ord(password[10]) + ord(password[5]) != 166 or ord('n') - ord(password[9]) != 1 or password[10] != str(3):
    print('Sorry, the password is incorrect.')
else:
    print(f"Well Done! HTB{{{password}}}")

Giải nó và ta sẽ có được mật khẩu là 0p3n_s3sam3!

Flag: HTB{0p3n_s3sam3!}

Challenge 14: Rebuilding

You arrive on a barren planet, searching for the hideout of a scientist involved in the Longhir resistance movement. You touch down at the mouth of a vast cavern, your sensors picking up strange noises far below. All around you, ancient machinery whirrs and spins as strange sigils appear and change on the walls. You can tell that this machine has been running since long before you arrived, and will continue long after you're gone. Can you hope to understand its workings?

Download Challenge Here

Solution

Chúng ta có thể sử dụng lệnh 'file' để cung cấp cái nhìn tổng quan về loại tệp.

L6TKQkF

Mở chương trình trong IDA.

Xd0tD59

Chúng ta có thể nhận ra rằng input_value[i] = encrypted[i] ^ key[i%len(key)]. Lúc đầu, key = humans nhưng giá trị trả về lại sai. Tôi tìm thấy xrefs cho sub_84A() được gọi bởi gọi bởi _libc_csu_init().

Hàm _libc_csu_init (C Runtime Support Initialization) là một thủ tục được trình biên dịch C thêm vào chương trình để thực hiện các tác vụ khởi tạo liên quan đến thư viện C và môi trường thực thi trước khi hàm main() được gọi. Vì vậy khi chạy chương trình, key = aliens. Đọc thêm tại đây

image

Flag: HTB{h1d1ng_c0d3s_1n_c0nstruct0r5}