看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): hi,all 我之前在玩google舉辦的CTF 有一題是逆向工程的題目 檔案在此 http://tinyurl.com/htx9l98 程式執行後,第二個參數是輸入金鑰授權字串 金鑰就是這題的通關字串 如果如果正確的金鑰授權字串就會show出字串說產品已啟動. 我用objdump反組譯這隻程式後 程式一開始會比對參數的個數是不是2個, 之後會把你的第二個參數用strncpy拷貝到另一個變數去 然後再去比對你輸入的金鑰正不正確. 它第一個比對function如下 4027f0: 0f b6 15 ef 1a 20 00 movzx edx,BYTE PTR [rip+0x201aef] # 6042e6 4027f7: 0f b6 05 e0 1a 20 00 movzx eax,BYTE PTR [rip+0x201ae0] # 6042de 4027fe: 0f b6 0d c1 1a 20 00 movzx ecx,BYTE PTR [rip+0x201ac1] # 6042c6 402805: 0f b6 35 bc 1a 20 00 movzx esi,BYTE PTR [rip+0x201abc] # 6042c8 40280c: 0f b6 3d ad 1a 20 00 movzx edi,BYTE PTR [rip+0x201aad] # 6042c0 402813: 31 d0 xor eax,edx 402815: 29 f0 sub eax,esi 402817: 01 c8 add eax,ecx 402819: 40 38 c7 cmp dil,al 40281c: 75 02 jne 402820 40281e: f3 c3 repz ret 402820: 50 push rax 402821: bf ff 00 00 00 mov edi,0xff 402826: e8 25 e0 ff ff call 400850 中間的 cmp dil,al 就是比對的指令 (不過我不清楚dil是什麼意思...我google不到= =) 如果比對失敗會跳到 0x402820這個位置,之後會call 0x400850 顯示回傳的edi值,也就是255,然後跟你講驗證失敗 如果比對成功會return回原位址繼續下一個比對 我在想,我用gdb把中斷點設在0x402819的位置再去show出暫存器的內容 應該可以看到ax暫存器的值 (gdb) b *0x402819 Breakpoint 2 at 0x402819 (gdb) r abc Breakpoint 2, 0x0000000000402819 in ?? () (gdb) info registers rax 0x0 0 rbx 0x0 0 rcx 0x0 0 rdx 0x0 0 rsi 0x0 0 rdi 0x61 97 可是不知道為什麼rax這邊的值是0 我有哪裡沒考慮到的嗎? thanks! -- 你的行動或許沒有意義,但你還是非做不可。 這不是為了改變世界,而是為了讓你成為不會被世界改變的那個人. – 甘地(Mahatma Gandhi) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.151.107 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1462436124.A.48E.html
loveflames: dil就是edi的最低8個bit 05/05 16:41
原來如此,感謝說明!
b0920075: 我以為這種要去ASM那邊問? 05/05 17:17
啊…看來我好像問錯版了 ※ 編輯: HowLeeHi (1.163.151.107), 05/05/2016 17:21:47