我正在处理控制台 Windows 可执行文件。到目前为止,我发现可执行文件会检查命令行参数的数量。之后,它根据传递的参数数量(argv)进行分支。使用某种动态构造的跳转表来查找跳转。试图找出所有可能的命令行参数似乎是一项艰巨的任务。看起来二进制文件仅在解析特定数量的特定参数时才执行。我使用strings实用程序收集了一些可能的选项。
是否有反转命令行参数的通用路线图?有哪些可能的方法可以逆转它们?有没有可以使用的工具?
我正在处理控制台 Windows 可执行文件。到目前为止,我发现可执行文件会检查命令行参数的数量。之后,它根据传递的参数数量(argv)进行分支。使用某种动态构造的跳转表来查找跳转。试图找出所有可能的命令行参数似乎是一项艰巨的任务。看起来二进制文件仅在解析特定数量的特定参数时才执行。我使用strings实用程序收集了一些可能的选项。
是否有反转命令行参数的通用路线图?有哪些可能的方法可以逆转它们?有没有可以使用的工具?
如果您确定了 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,这是我们的实际参数向量。
你真的可以很容易地使用静态和动态分析来分析参数,但有一些注意事项你必须牢记在心。
这里还有额外的说明,有时我们可能“不”使用 argc/argv 来获取命令行参数,我们也可以使用 Windows API 之类的GetCommandLine。您还必须检查参数是如何接收和解析的。