這裏是我對代碼的作用以及解決方法的理解:首先,我需要找到一個字符串,然後對該字符串進行反向工程,字節查找表,我已經找到。我知道這些「偏移量」的值必須加起來爲60,見行< + 53>。解散二進制炸彈:phase_5
我試圖通過使用x/s 0x4011fe和其他檢查命令(x/6c等)來找到這6個字符的字符串,但我沒有得到任何接近正確的東西。有什麼我可以改變以獲得正確的輸出,以便我可以繼續消除這個階段?
一旦我找到這個字符串,我的想法是查看這個需要的輸出字符串,然後找出需要達到預期輸出的輸入字符串。我想 - 查看每個字符的十六進制值,將它們與我的表(最低順序)進行比較,然後使用ascii表查找相應的字符。我只是想知道這是否是正確的方法,謝謝。
查找表: phase_5的
(gdb) x/16xw 0x402780
<array.3600>: 0x00000002 0x0000000a 0x00000006 0x00000001
<array.3600>: 0x0000000c 0x00000010 0x00000009 0x00000003
<array.3600>: 0x00000004 0x00000007 0x0000000e 0x00000005
<array.3600>: 0x0000000b 0x00000008 0x0000000f 0x0000000d
拆卸:
0x00000000004011bf <+0>: push %rbx
0x00000000004011c0 <+1>: mov %rdi,%rbx
0x00000000004011c3 <+4>: callq 0x401414 <string_length>
0x00000000004011c8 <+9>: cmp $0x6,%eax //6 letter string!
0x00000000004011cb <+12>: je 0x4011d2 <phase_5+19> //if 6, jump over the explode
0x00000000004011cd <+14>: callq 0x401706 <explode_bomb>
0x00000000004011d2 <+19>: mov %rbx,%rax
0x00000000004011d5 <+22>: lea 0x6(%rbx),%rdi
0x00000000004011d9 <+26>: mov $0x0,%ecx
0x00000000004011de <+31>: movzbl (%rax),%edx
0x00000000004011e1 <+34>: and $0xf,%edx //」and」 each letter
0x00000000004011e4 <+37>: add 0x402780(,%rdx,4),%ecx
0x00000000004011eb <+44>: add $0x1,%rax
0x00000000004011ef <+48>: cmp %rdi,%rax //compare, and then loop again.
0x00000000004011f2 <+51>: jne 0x4011de <phase_5+31> //loop!
0x00000000004011f4 <+53>: cmp $0x3c,%ecx //final compare, and then done! (0x3c = 60)
0x00000000004011f7 <+56>: je 0x4011fe <phase_5+63> //jump over explode, and finish!
0x00000000004011f9 <+58>: callq 0x401706 <explode_bomb>
0x00000000004011fe <+63>: pop %rbx
0x00000000004011ff <+64>: retq
End of assembler dump.
我從來沒有喜歡過人投票而沒有提供至少一些反饋意見。我沒有投票,但是由於其他人沒有對你做出解釋:你發佈了一個家庭作業問題,基本上說「我不知道該怎麼做,答案是什麼?」如果你發佈你的目標是什麼,並要求向正確的方向推進,你將會有更好的運氣......儘管我不認爲stackoverflow.com是那個地方。 –
此外:當我看到有人發佈作業問題並得到積極迴應時,通常作者已經概述了他們嘗試過的一些事情,因此人們並不覺得他們在做作家的作業。 –
對不起,@BrianVandenberg,我真的很感謝您的評論!我編輯了我的問題,希望現在好一點。我主要關注如何找到要檢查的字符串,因爲我已經有幾天了。我試圖解釋我的思維過程,希望得到確認,我正確思考,我會盡量讓這個更清楚。再次感謝! – Mary