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

作者: HowLeeHi (處處留心皆正妹)   2016-05-05 16:15:19
開發平台(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!
作者: loveflames (咕啾咕啾魔法陣)   2016-05-05 16:41:00
dil就是edi的最低8個bit
作者: b0920075 (Void)   2016-05-05 17:17:00
我以為這種要去ASM那邊問?

Links booklink

Contact Us: admin [ a t ] ucptt.com