美文网首页
手写fuzzer实现anti-debugging趣味实验 XD

手写fuzzer实现anti-debugging趣味实验 XD

作者: 看雪学院 | 来源:发表于2019-01-09 18:12 被阅读15次

    在youtube和国外论坛上看到了一种比较有趣的使用fuzzing实现反调试的思路。

    方法的原理很简单,通过循环修改源文件的一个byte使得该文件正常共能能够实现,但是能够对gdb和radare2这类调试软件进行一定程度上的干扰。通过实验之后发现,该方法不一定适合实战,但是可能会在对于反调试这一部分开拓新思路上面会有所帮助。

    首先使用C语言写一个类似于Crackme的简单小程序:

    #include <stdio.h>

    #include <string.h>

    int main(int argc, char* argv[])

    {

    if(argc==2)

    {

    if (strcmp("CORRECT_SERIAL", argv[1])==0)

    {

    printf("Accessed!\n");

    }

    else

    {

    printf("Denied!\n");

    }

    }

    else

    {

    printf("Usage %s [serial_number]\n", argv[0]);

    }

    }

    然后写一个python脚本自动实现上述的通过fuzzing进行反调试的实验

    源代码:

    #/bin/python3!

    import os

    import random

    def alter_byte(bytes_in):

    i = random.randint(0, len(bytes_in))

    c = chr(random.randint(0,255))

    return bytes_in[:i] + c.encode()+ bytes_in[i+1:]

    def alter_file():

    with open("secret", 'rb') as f_obj, open("secret_tmp", 'wb') as new_f:

    f_content = f_obj.read()

    new_content = alter_byte(f_content)

    new_f.write(new_content)

    def cmp_out_file(f_1, f_2):

    with open(f_1, 'rb') as f_1_obj, open(f_2, 'rb') as f_2_obj:

    return f_1_obj.read() == f_2_obj.read()

    def check_normal():

    cmd = "(./secret_tmp; ./secret_tmp CORRECT_SERIAL; ./secret_tmp WRONG_SERIAL) > normal_tmp.txt"

    os.system(cmd)

    return cmp_out_file("std_output.txt", "normal_tmp.txt")

    def check_gdb():

    os.system("echo disassemble main | gdb secret_tmp > gdb_tmp.txt")

    return cmp_out_file("gdb.txt", "gdb_tmp.txt")

    def check_r2():

    os.system("echo 'aaa\rs main\rpdf' | radare2 secret_tmp > r2_tmp.txt")

    return cmp_out_file("r2_tmp.txt", "r2.txt")

    if __name__ == '__main__':

    os.system("cp secret secret_tmp")

    os.system("echo disassemble main | gdb secret_tmp > gdb.txt")

    os.system("(./secret_tmp; ./secret_tmp CORRECT_SERIAL; ./secret_tmp WRONG_SERIAL) > std_output.txt")

    os.system("echo 'aaa\rs main\rpdf' | radare2 secret_tmp > r2.txt")

    while True:

    alter_file()

    if check_normal() and not check_gdb() and not check_r2():

    print("************* Found possible solution ************")

    os.system("rm gdb.txt r2_tmp.txt r2.txt gdb_tmp.txt normal_tmp.txt std_output.txt")

    exit()

    这段代码主要实现了在程序功能正常的情况下对 radare2 和 gdb的实现反调试的功能。

    因为Crackme程序中只有一个main函数,所以check_r2()函数主要是要能对main函数进行一定的干扰。

    运行程序之后会生成一个secret_tmp的二进制文件。

    下面是几组在fuzzing之前和之后的对比。

    1. fuzzing前后直接运行对比:

    修改后的文件都能够正常实现应有的功能。

    2. fuzzing前后gdb调试对比:

    源文件gdb调试:

    修改后gdb调试:

    3. fuzzing前后radare2 调试对比:

    源文件:

    源文件disassemble函数表

    源文件main函数disassembling

    修改后:

    修改后文件disassemble函数表

    修改后main函数disassembling

    对比前后可发现,修改后的文件不太能被反汇编,并且会显示不可识别文件。radare2还能够进行反汇编,但是函数列表基本除了main不可读。内部函数也看不出调用了printf和strcmp等libc函数。通过ltrace也不太能发现libc函数调用记录:

    总结:

    总的来说这是个很有意思的过程,单纯的整个过程可能对于实际来说并没有很大的帮助,但是是个很有趣的思路,或许经过多次实验通过一些统计可能会发现一些有趣的现象,比如可以对一个指定区域的二进制内容范围进行fuzzing,或许能够发现一些有趣的内容。

    原文作者:逆向实习生

    原文链接:https://bbs.pediy.com/thread-248834.htm

    转载请注明:转自看雪学院

    更多阅读:

    [原创]在 VS2017 使用所有旧版本的平台工具集

    [原创]支持Windows7 x64的kdusb3

    [虚拟机保护] [原创] 手动分析VMP加密的x64驱动导入表

    [原创]编译libc.so过time函数反调试

    相关文章

      网友评论

          本文标题:手写fuzzer实现anti-debugging趣味实验 XD

          本文链接:https://www.haomeiwen.com/subject/rzigrqtx.html