如何反转命令行参数?

逆向工程 拆卸 二元分析 艾达 C C++
2021-06-30 02:47:29

我正在处理控制台 Windows 可执行文件。到目前为止,我发现可执行文件会检查命令行参数的数量。之后,它根据传递的参数数量(argv)进行分支。使用某种动态构造的跳转表来查找跳转。试图找出所有可能的命令行参数似乎是一项艰巨的任务。看起来二进制文件仅在解析特定数量的特定参数时才执行。我使用strings实用程序收集了一些可能的选项

是否有反转命令行参数的通用路线图?有哪些可能的方法可以逆转它们?有没有可以使用的工具?

1个回答

如果您确定了 argv 和 argc 以及其中的值,那么您就成功了一半。从 argc 的值中,您可以了解应该传递多少个参数,从 argv 中的值中,您可以确定“应该”传递什么。

我为你写了一个非常简单的例子

70 _main           proc near               ; CODE XREF: _main_0j
.text:00401070
.text:00401070 var_44          = byte ptr -44h
.text:00401070 var_4           = dword ptr -4
.text:00401070 arg_0           = dword ptr  8
.text:00401070 arg_4           = dword ptr  0Ch
.text:00401070
.text:00401070                 push    ebp
.text:00401071                 mov     ebp, esp
.text:00401073                 sub     esp, 44h
.text:00401076                 push    ebx
.text:00401077                 push    esi
.text:00401078                 push    edi
.text:00401079                 lea     edi, [ebp+var_44]
.text:0040107C                 mov     ecx, 11h
.text:00401081                 mov     eax, 0CCCCCCCCh
.text:00401086                 rep stosd
.text:00401088                 cmp     [ebp+arg_0], 2
.text:0040108C                 jge     short loc_4010A0
.text:0040108E                 push    offset aCheckUsage ; "check usage"
.text:00401093                 call    _printf
.text:00401098                 add     esp, 4
.text:0040109B                 or      eax, 0FFFFFFFFh
.text:0040109E                 jmp     short loc_4010DB

如您所见,cmp [ebp+arg_0], 2这意味着至少我们必须传递一个“参数”,然后是 jqe (如果大于或等于则跳转)。

所以我们将使用一个参数调用程序来传递这个条件,所以我们将进入loc_4010A0,这是代码。

0 loc_4010A0:                             ; CODE XREF: _main+1Cj
.text:004010A0                 push    offset Str2     ; "n00b"
.text:004010A5                 mov     eax, [ebp+arg_4]
.text:004010A8                 mov     ecx, [eax+4]
.text:004010AB                 push    ecx             
.text:004010AC                 call    _strcmp         
.text:004010B1                 add     esp, 8          
.text:004010B4                 mov     [ebp+var_4], eax
.text:004010B7                 cmp     [ebp+var_4], 0  
.text:004010BB                 jle     short loc_4010CC
.text:004010BD                 push    offset aWrongPassword ; "wrong password !!!"
.text:004010C2                 call    _printf        
.text:004010C7                 add     esp, 4          
.text:004010CA                 jmp     short loc_4010D9 

现在正如您所看到的,这次我们使用 strcmp 进行了另一个比较,在此之前我们将推送我们的 str arg_4,这是我们的实际参数向量。

你真的可以很容易地使用静态和动态分析来分析参数,但有一些注意事项你必须牢记在心。

  1. 我们必须传递多少参数
  2. 参数类型
  3. 参数的位置(argv)

这里还有额外的说明,有时我们可能“不”使用 argc/argv 来获取命令行参数,我们也可以使用 Windows API 之类的GetCommandLine您还必须检查参数是如何接收和解析的。