Skip to main content
  1. Posts/

[Write-Up RE] Get2TheHell

·3 mins· loading · loading · ·
WriteUp Reverse CTF Event
Ckagngoc
Author
Ckagngoc
Table of Contents

Hì hì bài sửa chữa sai lầm và vực dậy chút tinh thần sau kỳ thi 😂😂😂

Ý tưởng
#

Dựa vào hint Heaven Gate mình có tra được trên mạng tìm được đoạn này:

Thực hành
#

Theo ý tưởng phân tích, bên trong hàm main là hàm kiểm tra các đặc tính của flag:

Ta thấy được rằng, trong câu lệnh if hàm main kiểm tra một số đặc tính đơn giản và có một hàm sub_D61000 đặc biệt. Kiểm tra hàm này ta nhận ra hàm cấp phát một vùng nhớ cho con trỏ lpAddress và config một số thứ trên vùng nhớ này để thực thi một đoạn code trên vùng nhớ đó và kiểm tra bằng câu lệnh if sau đó sẽ giải phóng vùng nhớ này. 🙄😶😑
Ta tiến hành đặt breakpoint tại vị trí này và xem nó cấp phát cho ta cái gì và nhận được một hàm ngắn
Hàm này gọi đến một đoạn code ngắn <Nhớ make code bằng nút ‘C’ mới hiện> và trong đó có thứ rất đang nghi 😑😐😐 Offset của input
Đọc đoạn code này mình đoán được đây là hàm chính cần xem xét nhưng bên trong hàm xuất hiện một số ký tự lạ và một vài byte không xác định, thêm với đó là một số câu lệnh đọc rất khó hiểu như sau:

Tình trạng chung là có những dấu hiệu địa chỉ kia là x64 và biểu hiện rất giống Heaven Gate như ý tưởng !!! 🙂🙂🙂

Cách làm
#

Ta tiến hành dump số byte tại vùng nhớ này ra để patch lại vào một file x64 xem ý nghĩa code là gì <Đại ca nào đó rất đẹp zai chỉ dạy 😋😋😋> Ta nắm lại vị trí bắt đầu của lpAddress và số lượng byte để dumo nguyên cả vùng nhớ đó ra

Mình tiến hành code một file hello world bằng c sau đó dịch ra x64 bằng g++ Sau đó patch đoạn byte đã dump ra vào entry point của chương trình để thực thi chỗ shellcode này.

Python Script patch bytes
#

import ida_bytes

newbytes = b"\x6A\x03\x58\xC1\xE0\x04\x04\x03\x50\x68\x34\x00\xCC\x00\xCB\xFE\xE2\x7B\x21\x9C\xEA\x4F\x05\xE0\xEA\x4F\x8D\x18\x5E\xE5\x5D\x18\x68\xE9\x03\x1E\x3C\x63\x89\xBE\xE2\x7D\x89\xC6\xEA\x7B\x51\x10\x5E\x69\x89\xA0\xB8\x08\x00\x00\x00\x83\xE8\x25\x85\xC0\x75\x51\x49\xB8\x59\xFC\x9F\x00\x00\x00\x00\x00\x49\xB9\x0F\x00\xCC\x00\x00\x00\x00\x00\x31\xF6\x48\x8D\x56\x3C\x48\x8D\x4E\x41\x4C\x8D\x96\xD3\x00\x00\x00\x4C\x8D\x9E\xF7\x00\x00\x00\x48\x83\xFE\x25\x73\x1F\x41\x8A\x04\x31\xD0\xC8\x41\x32\x04\x30\x30\xD0\x84\xC0\x87\xCA\x44\x87\xD1\x45\x87\xDA\x75\x07\x48\x8D\x74\x30\x01\xEB\xDB\x48\xBA\x34\xFC\x9F\x00\x00\x00\x00\x00\x48\x89\x02\x6A\x23\x68\xA7\x00\xCC\x00\x48\xCB\xC3"
size = len(newbytes)
start_address = 0x0000000000001050

for i in range(0,size):
    ida_bytes.patch_byte(start_address,newbytes[i])
    start_address += 1

Và đây là thành quả

Hàm khá dễ đọc cũng không nhất thiết là phải debug làm gì, chương trình sẽ đổi giá trị các thanh ghi sau mỗi vòng lạp lấy cipher để xor với dl và input, với cipher là đoạn byte không phải code trong vùng nhớ này, vì là mã đối xứng nên ta chỉ cần làm ngược lại quy trình mã hóa 😚😚😙

Code giải mã
#

def rotate_bits_right(number, positions, bitsize=32):
    mask = (1 << bitsize) - 1
    return ((number & mask) >> positions) | ((number & mask) << (bitsize - positions)) & mask

r9 = b"\xFE\xE2\x7B\x21\x9C\xEA\x4F\x05\xE0\xEA\x4F\x8D\x18\x5E\xE5\x5D\x18\x68\xE9\x03\x1E\x3C\x63\x89\xBE\xE2\x7D\x89\xC6\xEA\x7B\x51\x10\x5E\x69\x89\xA0"

r8 = ""

rdx = 0x3c

rcx = 0x41

r10 = 0xd3

r11 = 0xf7

flag = b""

tmp = 0

for i in range(0,37):
    tmp = rotate_bits_right(r9[i],1,8)
    tmp ^= rdx
    r8 += chr(tmp)
    rcx, rdx = rdx, rcx
    r10, rcx = rcx, r10
    r11, r10 = r10, r11
print(r8)

Flag: MSEC{C0ngr4tuL4t10n!Y0u’v3_b3c0m3_4n_4ng3l}
#

🤑🤑🤑

–Ckagngoc–

Related

[Write-Up RE] PTITCTF RE02
·3 mins· loading · loading
WriteUp Reverse CTF Event
[Write-Up RE] Flag_Checker KCSC
·5 mins· loading · loading
WriteUp Reverse
[Write Up RE] Rifle-AK47
·5 mins· loading · loading
CTF Reverser
PicoCTF-WriteUp-ReverseEasy
·4 mins· loading · loading
CTF Reverse
AboutMe
·1 min· loading · loading
Profiles
IDApython cheat-sheet
·18 mins· loading · loading
IDApython IDA Scrips Reverse