[問題] 請問C程式的反組譯問題

看板C_and_CPP作者 (處處留心皆正妹)時間9年前 (2016/05/05 16:15), 9年前編輯推噓2(200)
留言2則, 2人參與, 最新討論串1/2 (看更多)
開發平台(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

05/05 16:41, , 1F
dil就是edi的最低8個bit
05/05 16:41, 1F
原來如此,感謝說明!

05/05 17:17, , 2F
我以為這種要去ASM那邊問?
05/05 17:17, 2F
啊…看來我好像問錯版了 ※ 編輯: HowLeeHi (1.163.151.107), 05/05/2016 17:21:47
文章代碼(AID): #1NAm4SIE (C_and_CPP)
文章代碼(AID): #1NAm4SIE (C_and_CPP)