虽然很简单(起初),但我还是陷入了这个二进制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