我找到了这个平台及其进入逆向工程的课程路径。

虽然很简单(起初),但我还是陷入了这个二进制n.2中。 Binary看起来非常简单明了,但是我无法弄清楚代码如何计算用户密码的长度。我可以在反汇编的代码中看到:



strlen调用之前,EAX将始终指向命令行:

r2 -Ad ./reverse2.dms AAAAAAAAAAAAAAAAAAAAAAAAAAA


由于字符串0x0e的长度而不是提交的密码的长度,它将始终计数为./reverse2.dms个字符。也许...我根本不明白。但是对于这种情况,由于0x0e < 0x15永远不会到达有趣的循环。 />
我错了吗?

#1 楼

正如您最初的直觉告诉您的那样,这是一个非常简单的挑战,而且您很亲密。让我们一起了解程序的逻辑。正如您所做的,我使用了radare2。

让我们在radare2中打开程序: br />
$ r2 reverse2


如果需要,可以使用radar的出色可视化图形模式轻松检测函数的流程:
br />首先程序检查您是否向程序传递了至少一个参数,即num_of_arguments > 1。请记住,文件名计为1个参数,因此您需要另一个参数。

[0x08048350]> aa
[0x08048350]> pdf @ main


然后检查文件名是否超过15个字符长:

[0x08048350]> VV @ main


因此,您需要将文件名更改为超过15个字符的长度,并为其传递至少一个参数。部分。在以下情况下,程序将检查filename[some_offset] == chr(0x??)是否存在,如果是,它将转到文件名中的另一个偏移量并在其中检查值。
例如,在第一次检查中,您可以看到:

0x08048456      837d0801       cmp dword [arg_8h], 1
0x0804845a      7f16           jg 0x804847


在此块中,检查是否通过雷达提示您0x73等于字母's'。

如果是,则跳至另一个块:

0x08048472      8b450c         mov eax, dword [arg_ch]     ; [0xc:4]=-1 ; 12
0x08048475      8b00           mov eax, dword [eax]
0x08048477      89442418       mov dword [local_18h], eax
0x0804847b      8b442418       mov eax, dword [local_18h]  ; [0x18:4]=-1 ; 24
0x0804847f      890424         mov dword [esp], eax
0x08048482      e8a9feffff     call sym.imp.strlen         ; size_t strlen(const char *s)
0x08048487      8944241c       mov dword [local_1ch], eax
0x0804848b      837c241c15     cmp dword [local_1ch], 0x15 ; [0x15:4]=-1 ; 21


在此块中,程序检查是否filename[0x14] == chr(0x73)
以此类推,直到检查所有偏移量。 '将它留给您解决,并弄清楚程序的名称是什么。
祝你好运!

#2 楼

好吧,这似乎正是您应执行的工作,因为代码检查二进制文件的名称,而不是传递给它的参数,因为argv[0]是“二进制文件的文件名”。

因此,您的解决方案是将名称更改为长于0x15或修补二进制文件。也许以后会有一些东西可以转向其中一种解决方案(即检查名称),但是现在看来您可以选择其中任何一种。

评论


好的,我知道了。我会继续。但是,第一个结论是发表的文章是错误的。

– Kartone
17年12月28日在16:14

我不知道内容是什么,但查看其余的代码,很明显该标志位于二进制名称中

–PawełŁukasik
17/12/28在16:46