最近パズルを受け取りました。バイナリファイルがあり、このパズルの目的はバイナリファイルの16進ダンプに隠されたパスワードを発見することです。私はthis guidelineに従おうとしましたが、私が到達した時点で続けるというアイデアはありません。バイナリファイルのパスワードを見つける方法
#h begins the printf "password: "
4006dc: bf 14 08 40 00 mov $0x400814,%edi
4006e1: b8 00 00 00 00 mov $0x0,%eax
#h sets %eax to NULL
4006e6: e8 a5 fe ff ff callq 400590 <[email protected]>
4006eb: 48 8b 15 6e 09 20 00 mov 0x20096e(%rip),%rdx # 601060 <[email protected]@GLIBC_2.2.5>
4006f2: 48 8d 45 b0 lea -0x50(%rbp),%rax
#h probably the address of the string "password: "
4006f6: be 32 00 00 00 mov $0x32,%esi
4006fb: 48 89 c7 mov %rax,%rdi
4006fe: e8 ad fe ff ff callq 4005b0 <[email protected]>
#h calling the fgets function, so here we know which register is being used for storing the input
400703: c7 45 ac 00 00 00 00 movl $0x0,-0x54(%rbp)
#h makes mem[rbp-84] = NULL
40070a: c7 45 a8 00 00 00 00 movl $0x0,-0x58(%rbp)
#h makes mem[rpb-88] = NULL
400711: eb 27 jmp 40073a <[email protected]+0x17a>
#h jumps unconditionally to the pc address 40073a
400713: 8b 45 a8 mov -0x58(%rbp),%eax
400716: 48 98 cltq
400718: 0f b6 44 05 b0 movzbl -0x50(%rbp,%rax,1),%eax
40071d: 0f be d0 movsbl %al,%edx
400720: 8b 45 a8 mov -0x58(%rbp),%eax
400723: 48 98 cltq
400725: 0f b6 44 05 b0 movzbl -0x50(%rbp,%rax,1),%eax
40072a: 0f be c0 movsbl %al,%eax
40072d: 89 c1 mov %eax,%ecx
#h ecx loop counter
40072f: d3 e2 shl %cl,%edx
400731: 89 d0 mov %edx,%eax
#h moves edx to eax
400733: 31 45 ac xor %eax,-0x54(%rbp)
#h do a xor between eax and -0x54(rbp)
400736: 83 45 a8 01 addl $0x1,-0x58(%rbp)
#h pc address 40073a is below here
40073a: 8b 45 a8 mov -0x58(%rbp),%eax
40073d: 48 63 d8 movslq %eax,%rbx
400740: 48 8d 45 b0 lea -0x50(%rbp),%rax
#h register rax receives the mem[rbp-80] (first local variable)
400744: 48 89 c7 mov %rax,%rdi
400747: e8 24 fe ff ff callq 400570 <[email protected]>
40074c: 48 39 c3 cmp %rax,%rbx
40074f: 72 c2 jb 400713 <__gmon_start__[email protected]+0x153>
#h if %rax < %rdi, jump to pc = 400713
400751: 81 7d ac 62 02 49 0d cmpl $0xd490262,-0x54(%rbp)
#here it compares the 0xd490262 memory address with mem[rbp-84], so I guess that the -0x54(%rbp) contains the string we want, but where???
400758: 75 0c jne 400766 <[email protected]+0x1a6>
#h here it does the jump if not equal, so the contents we want is on $0xd490262
#h WELL DONE!
40075a: bf 1f 08 40 00 mov $0x40081f,%edi
40075f: e8 fc fd ff ff callq 400560 <[email protected]>
400764: eb 0a jmp 400770 <[email protected]+0x1b0>
#h wrong password
400766: bf 2b 08 40 00 mov $0x40082b,%edi
40076b: e8 f0 fd ff ff callq 400560 <[email protected]>
400770: 48 8b 4d e8 mov -0x18(%rbp),%rcx
400774: 64 48 33 0c 25 28 00 xor %fs:0x28,%rcx
40077b: 00 00
注:これは、ロジックを持っているコードの一部である私は私のすべての私のコメントが正しいかどうかわからないので、これを100%にしてください信用していません。
私はこのファイルを2日間分析してアイデアを得ようとしていますが、私は枯れてしまったと思います。
念のために、バイナリがいることを実行します。
$./binary
$password: (fgets function in here)
$wrong password!
は誰もが私にヒントを与えることはできますか?からトレース
アセンブリコードと同じことをするCコードを記述してください。 – fuz
@FUZxxl私はすでにそれをやろうとしましたが、バイナリの作者は私とはまったく異なるロジックを使っていたと思います。 ( – Barretxx
)このコードを近似するために書くコードは、同じアセンブリを生成する可能性は非常に低くなります。 – fuz