[问题] 请问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