作者HowLeeHi (处处留心皆正妹)
看板C_and_CPP
标题[问题] 请问C程式的反组译问题
时间Thu May 5 16:15:19 2016
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1462436124.A.48E.html
1F:推 loveflames: dil就是edi的最低8个bit 05/05 16:41
原来如此,感谢说明!
2F:推 b0920075: 我以为这种要去ASM那边问? 05/05 17:17
啊…看来我好像问错版了
※ 编辑: HowLeeHi (1.163.151.107), 05/05/2016 17:21:47