iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
1
Security

逆向工程 – 從入門到放棄系列 第 27

Day27 - 防止被 Debugger 逆向

昨天有嘗試將驗證字串編碼,但還是容易被逆向找到程式邏輯並繞過。今天嘗試透過 Fuzzing 將程式位元反轉使得 Debugger 無法逆向。

目標:

如下圖,Bash 可以直接執行該程式,而 GDB 與 Radare 2 無法開啟。

方法

使用 Fuzzing 以達成 Parser Differential Attack

Parser Differential Attack 是什麼?

makes modifications to the ELF file such that it will still execute fine, but the disassembler/debugger will not work properly if you loads a binary into it. Similar techniques can be done on other file format like Portable Executable (PE) as well.

Reference

實作

透過比對被 fuzzing (將隨機位元交換)檔案的 output,達到可以執行原本程式,但無法使用 Debugger 開啟。

import random
import os

os.system("cp license_2 license_2_fuzz")

def flip_byte(in_bytes):
    i = random.randint(0,len(in_bytes))
    c = chr(random.randint(0,0xFF))
    return in_bytes[:i]+c+in_bytes[i+1:]

def copy_binary():
    with open("license_2", "rb") as orig_f, open("license_2_fuzz", "wb") as new_f:
        new_f.write(flip_byte(orig_f.read()))

def compare(fn1, fn2):
    with open(fn1) as f1, open(fn2) as f2:
        return f1.read()==f2.read()

def check_output():
    os.system("(./license_2_fuzz ; ./license_2_fuzz AAAA-Z10N-42-OK) > fuzz_output")
    return compare("orig_output", "fuzz_output")


def check_gdb():
    os.system("echo disassemble main | gdb license_2_fuzz > fuzz_gdb")
    return compare("orig_gdb", "fuzz_gdb")

def check_radare():
    os.system('echo -e "aaa\ns sym.main\npdf" | r2 license_2_fuzz > fuzz_radare')
    return compare("orig_radare", "fuzz_radare")

while True:
    copy_binary()
    if check_output() and not check_gdb() and not check_radare():
        print "FOUND POSSIBLE FAIL\n\n\n"
        os.system("tail fuzz_gdb")
        os.system("tail fuzz_radare")
        raw_input()

GDB 無法逆向(如下圖)
我們可以發現,在 GDB 使用 info func 與 disassemble main 都無法執行了。

Reference

結論

這樣就無法被 Debugger 逆向了XD 明天接著介紹 韓國 - 逆向 的題目。


上一篇
Day26 - 提升程式被逆向的難度 - 編碼
下一篇
Day28 - reversing.kr - Easy_ELF
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言