AlgoSec破解license

AlgoSec是防火牆規則審計的好工具。但是其license奇貴無比,一個防火牆的license動輒幾萬人民幣。所以如果想試用的話,需要進行破解。

1. 查找關鍵文件

一開始我也不知道破解的入口在哪裏。大膽猜測,在服務器上以關鍵字license和lic進行查找,發現了以下文件:/usr/share/fa/bin/install_lic_cli。運行一下,結果爲:

[root@localhost afa]# /usr/share/fa/bin/install_lic_cli
Error: Please provide license file.
Usage: install_lic_cli -file

看來這個就是安裝license的程序,查看一下,發現已經被加密了:

[root@localhost afa]# cat /usr/share/fa/bin/install_lic_cli
#!/usr/bin/perl
use algoenc;
b畞疙}Rb纄J屒忲v甗U慥皳eEu{侮卍慸線yG銷I踹r龠睭樧3圲u熓曕龢碥[臙鷔蜹窾兞”敨翡迧bx砍[x潚’f雪in纍 [W瓘〉fb蹃!$襣羒z綅澋.瘱鏦聞B唼遫w齙iik鶤1……

是否加密了我們就無計可施了呢?並不是的,這是一個perl腳本,而perl具有調試功能,從而讓我們看到解密後的程序。調試時,n爲單步運行,s爲步入函數內部,q爲退出。
隨便寫一個文件作爲license,單步運行到第52、53行時發現:

[root@localhost afa]# perl -d /usr/share/fa/bin/install_lic_cli -file test.lic
……
main::(/usr/share/fa/bin/install_lic_cli:52):
52: my $fa_server = FwaUtil::which_script(“fa_server”);
DB<1> n
main::(/usr/share/fa/bin/install_lic_cli:53):
53: my $sCMD = “$fa_server -f LICENSE install $lic_path”;

查找了一下,服務器上確實有fa_server這個文件。這還是一個加密了的perl腳本,單步運行一下就發現:

[root@localhost afa]# perl -d /usr/share/fa/bin/fa_server -f LICENSE install test.lic
……
FwaLic::CODE(0xa0dbab8)(/usr/share/fa/perl_lib/FwaLic.pm:78):

查看一下FwaLic.pm,這次沒有加密。代碼比較多就不貼了,關鍵有兩點:

  • 這一行,校對fa_usage這個文件的MD5:

    %md5sig = ( fa_usage => ‘1ef898e850586874af2d37405b5561b9’,

  • 這幾行,說明fa_usage就是用來驗證和安裝license的:

    # check if defined a license file name (= it was sent)
    # then we will send it to fa_usage with -v to check
    # that given license file name is valid
    if (defined $license_file_name)
    {
    $lic_param = “-v $license_file_name”;
    }

再查看一下,發現fa_usage是一個二進制文件,因此關鍵在於如何破解該文件。

2. 反編譯尋找繞過方式

反編譯Linux文件可以用objdump,我們把概要信息和完整的反編譯結果都生成出來:

objdump -x /usr/share/fa/bin/fa_usage > fa_usage_info.txt
objdump -D /usr/share/fa/bin/fa_usage > fa_usage.txt

注意fa_usage_info.txt中的SYMBOL TABLE,摘選如下:

80502e9 g F .text 00000177 lic_sign_file_internal
0804fe86 g F .text 000000ce lic_load_file_to_ctx
0804b82d g F .text 000000ff allow_init_license
0804fd0e g F .text 00000178 lic_parse_file_stream
0804dcef g F .text 00000091 lic_print_error
08050460 g F .text 00000029 lic_sign_file
0804ff54 g F .text 00000294 copy_and_sign_file
0804db83 g F .text 00000095 lic_free_ctx
0804d078 g F .text 0000004d lfalic
0804de40 g F .text 000001ae lic_check
0804c48d g F .text 00000564 write_lic_ids
0804f6ca g F .text 0000022a lic_parse_key_value
0804dde4 g F .text 0000005a lic_perror
0804dac0 g F .text 000000c3 lic_alloc_ctx
0804bdf9 g F .text 00000385 check_ids_validity
0804e52a g F .text 0000020d lic_print_ctx
0804dd80 g F .text 00000064 lic_println_error
0804bc42 g F .text 00000119 install_license
0804dfee g F .text 0000011b lic_check_basic
0804f55d g F .text 0000016d parse_license_info
0804dc18 g F .text 000000d7 lic_strerror_r
0804ef16 g F .text 000001bf parse_sign
0805258c g O .bss 00000004 full_license_name
08050489 g F .text 00000029 lic_sign_file_forced
0804bb9f g F .text 000000a3 get_lic_path
0804d0c5 g F .text 000002c6 lfalic_lic
0804c17e g F .text 0000030f read_lic_ids
0804f8f4 g F .text 0000035a lic_parse_line
0804b92c g F .text 00000273 check_license_date
0804993f g F .text 0000039a print_license
0804f28e g F .text 000000c5 parse_issued
0804e109 g F .text 000000ab lic_check_mac_address
080504b2 g F .text 000000cf lic_validate_signature

這裏就是fa_usage中的各個子函數及其入口地址,帶lic字樣的就是和license相關的。我們在fa_usage.txt中查看這些函數的反編譯結果,就能找到破解方法。
假如你看過我之前的一篇文章X-Pack破解試用就知道,一般license文件都會帶簽名,我們只要能繞過驗籤環節,就能以最小的改動進行破解。於是,lic_validate_signature這個函數吸引了我的注意力。我猜測這個函數就是比對license簽名和根據license計算出的簽名的函數。根據反編譯結果,一個返回值是$0x0,另一個是$0x16。我們不妨假設$0x0表示一致,使其始終返回$0x0。如果猜錯了,使其始終返回$0x16即可。

3. 破解

這部分涉及的彙編語句爲:

8050562: c7 45 ec 16 00 00 00 movl $0x16,0xffffffec
8050569: eb 11 jmp 805057c
805056b: 83 45 fc 01 addl $0x1,0xfffffffc
805056f: 83 7d fc 01 cmpl $0x1,0xfffffffc
8050573: 7e d5 jle 805054a
8050575: c7 45 ec 00 00 00 00 movl $0x0,0xffffffec
805057c: 8b 45 ec mov 0xffffffec,%eax
805057f: c9 leave
8050580: c3 ret

注意8050562和8050575兩行,對應的十六進制值爲c7 45 ec 16 00 00 00c7 45 ec 00 00 00 00。我們將fa_usage用十六進制編輯器打開,例如Notepad++的插件HexEditor。然後查找c7 45 ec 16 00 00 00,通過上下文確認無誤,將其改爲c7 45 ec 00 00 00 00,保存即可。
用破解後的fa_usage替換原文件,用破解後fa_usage的新MD5值替換FwaLic.pm中的舊MD5值。然後再準備一個狂拽酷炫吊炸天的license文件:

LICENSE_VER=7.0
EXP_DATE=15-sep-2017
HOSTID=E505250101F7
ISSUER=root
ISSUED=01-May-2017
LICENSE_INFO1=PerFW;3;mvpboss1004;88888888
LICENSE_INFO2=Core;Optimization;Risk
SIGN=1234567890abcdef

這就是一個licenseID爲88888888、可用於3個防火牆、於2017年9月1日到期、授予mvpboss1004的license。注意這裏HOSTID要改爲服務器的MAC地址,ISSUED不要離當前日期超過5天。

5. 升級注意事項

顯然,升級後需要重新破解。除此之外還需要以下操作:

  • 破解完後要重啓服務,或直接重啓系統;
  • 要重新導入license,其中licenseID和SIGN要改的和原來不一樣,ISSUED要改成當天時間
發佈了72 篇原創文章 · 獲贊 34 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章