首页
社区
课程
招聘
[原创]第一题 helloctf IDA
2018-6-17 22:41 4768

[原创]第一题 helloctf IDA

2018-6-17 22:41
4768
这个是多次尝试得到的表然后对应破解的,

对汇编不太熟悉,下面的理解可能有误,希望大神指出


打开提示输入序列号,尝试几次后发现

输入长度大于17时程序直接退出



开始分析

拖入IDA中

打开后,找到main函数


可以看到刚才程序里的please input那些


这是自己的一些理解,最后还是要靠动态调试出来的
.text:00401009 push    ebp
.text:0040100A push    esi
.text:0040100B push    edi
.text:0040100C mov     esi, offset a437261636b4d65     ; "437261636b4d654a757374466f7246756e"
.text:00401011 lea     edi, [esp+70h+var_24]
.text:00401015 rep movsd
.text:00401017 movsw
.text:00401019 movsb
.text:0040101A
.text:0040101A loc_40101A:                             ; CODE XREF: _main+F6j
.text:0040101A                                         ; _main+108j
.text:0040101A mov     ecx, 8
.text:0040101F xor     eax, eax
.text:00401021 lea     edi, [esp+70h+var_48]
.text:00401025 push    offset aPleaseInputYou          ; "please input your serial:"
.text:0040102A rep stosd
.text:0040102C stosw
.text:0040102E stosb
.text:0040102F call    sub_40134B
.text:00401034 lea     eax, [esp+74h+var_5C]
.text:00401038 push    eax
.text:00401039 push    offset aS                       ; "%s"
.text:0040103E call    _scanf
.text:00401043 lea     edi, [esp+7Ch+var_5C]
.text:00401047 or      ecx, 0FFFFFFFFh
.text:0040104A xor     eax, eax
.text:0040104C add     esp, 0Ch
.text:0040104F repne scasb
.text:00401051 not     ecx
.text:00401053 dec     ecx
.text:00401054 cmp     ecx, 11h                        ; 11h,就是hex值为11,对应10进制为17,就是输入时的那个
.text:00401057 ja      loc_40110D                      ; jump if above,如果ecx大于17就跳转到loc_xxx那个位置
.text:0040105D xor     ebx, ebx
.text:0040105F
.text:0040105F loc_40105F:                             ; CODE XREF: _main+AEj
.text:0040105F mov     al, [esp+ebx+70h+var_5C]        ; 这里应该就是计算的算法,不过这里不会分析。。。。,不过还是按照自己理解注释一下
.text:00401063 test    al, al                          ; 上面这个mov al,[esp+ebs+70h+var_5C]就是取出输入字符的第几个字符,那个ebx的值一开始是0,之后会循环一次就+1
.text:00401065 jz      short loc_4010B0                ; 上面那个tset判断获取到的字符是否到了尾巴,jz结果为零时,就到下面那个地址
.text:00401067 movsx   ecx, al                         ; :带符号扩展传送指令,al就是刚才的字符,就是付给ecx,然后下面push吧
.text:0040106A push    ecx                             ; 第一个参数?
.text:0040106B lea     edx, [esp+74h+var_5E]
.text:0040106F push    offset asc_408044               ; 第一个参数 %x
.text:00401074 push    edx                             ; char *,ida自动提示是char*了,这个最后的push应该就是第一个参数
.text:00401075 call    _sprintf                        ; 调用sprintf参数,我们知道sprintf是sprintf(char*,格式,参数,所以怀疑push是一个个参数
.text:0040107A lea     edi, [esp+7Ch+var_5E]
.text:0040107E or      ecx, 0FFFFFFFFh
.text:00401081 xor     eax, eax
.text:00401083 add     esp, 0Ch
.text:00401086 repne scasb
.text:00401088 not     ecx
.text:0040108A sub     edi, ecx
.text:0040108C lea     edx, [esp+70h+var_48]
.text:00401090 mov     esi, edi
.text:00401092 mov     ebp, ecx
.text:00401094 mov     edi, edx
.text:00401096 or      ecx, 0FFFFFFFFh
.text:00401099 repne scasb
.text:0040109B mov     ecx, ebp
.text:0040109D dec     edi
.text:0040109E shr     ecx, 2
.text:004010A1 rep movsd
.text:004010A3 mov     ecx, ebp
.text:004010A5 and     ecx, 3
.text:004010A8 inc     ebx
.text:004010A9 cmp     ebx, 11h                        ; 这里还有个判断,应该是作为循环条件的
.text:004010AC rep movsb
.text:004010AE jl      short loc_40105F                ; jump less, ebs小于17时就跳到上面,达到循环的效果
.text:004010B0
.text:004010B0 loc_4010B0:                             ; CODE XREF: _main+65j
.text:004010B0 lea     esi, [esp+70h+var_24]           ; 这里又是一段,这两句lea是处理后的,下面对比用的
.text:004010B4 lea     eax, [esp+70h+var_48]
.text:004010B8
.text:004010B8 loc_4010B8:                             ; CODE XREF: _main+DAj
.text:004010B8 mov     dl, [eax]
.text:004010BA mov     bl, [esi]
.text:004010BC mov     cl, dl
.text:004010BE cmp     dl, bl
.text:004010C0 jnz     short loc_4010E0
.text:004010C2 test    cl, cl
.text:004010C4 jz      short loc_4010DC
.text:004010C6 mov     dl, [eax+1]
.text:004010C9 mov     bl, [esi+1]
.text:004010CC mov     cl, dl
.text:004010CE cmp     dl, bl
.text:004010D0 jnz     short loc_4010E0
.text:004010D2 add     eax, 2
.text:004010D5 add     esi, 2
.text:004010D8 test    cl, cl
.text:004010DA jnz     short loc_4010B8
.text:004010DC
.text:004010DC loc_4010DC:                             ; CODE XREF: _main+C4j
.text:004010DC xor     eax, eax
.text:004010DE jmp     short loc_4010E5
.text:004010E0 ; ---------------------------------------------------------------------------
.text:004010E0







调试开始,点Debugger,然后选择win32平台那个

调试窗口


在几个可疑的地方断点(上面那个循环也断了)

乱输入注册码,看看

17个1


可以在General register窗口里看到寄存器的值,循环那个断点对应循环了17次

到断点时,

循环时的

那个作为edx的第一个参数,在那对应的是RDX寄存器鼠标放上去可以看到值,或者双击进入



判断之后的代码




.text:004010B8 loc_4010B8:                             ; CODE XREF: _main+DAj

.text:004010B8 mov     dl, [eax]

.text:004010BA mov     bl, [esi]

.text:004010BC mov     cl, dl

.text:004010BE cmp     dl, bl

.text:004010C0 jnz     short loc_4010E0

.text:004010C2 test    cl, cl

.text:004010C4 jz      short loc_4010DC

.text:004010C6 mov     dl, [eax+1]

.text:004010C9 mov     bl, [esi+1]

.text:004010CC mov     cl, dl

.text:004010CE cmp     dl, bl

.text:004010D0 jnz     short loc_4010E0

.text:004010D2 add     eax, 2

.text:004010D5 add     esi, 2

.text:004010D8 test    cl, cl

.text:004010DA jnz     short loc_4010B8

.text:004010DC

.text:004010DC loc_4010DC:                             ; CODE XREF: _main+C4j

.text:004010DC xor     eax, eax

.text:004010DE jmp     short loc_4010E5

.text:004010E0 ; ---------------------------------------------------------------------------

.text:004010E0

.text:004010E0 loc_4010E0:                             ; CODE XREF: _main+C0j

.text:004010E0                                         ; _main+D0j

.text:004010E0 sbb     eax, eax

.text:004010E2 sbb     eax, 0FFFFFFFFh

.text:004010E5

.text:004010E5 loc_4010E5:                             ; CODE XREF: _main+DEj

.text:004010E5 test    eax, eax                        ; 想要test的结果是0,那么eax就要是0

.text:004010E7 jnz     short loc_4010FB                ; jump no zero 当上面的test结果是0时就输出成功

.text:004010E9 push    offset aSuccess                 ; 这里是成功时的

.text:004010EE call    sub_40134B

.text:004010F3 add     esp, 4

.text:004010F6 jmp     loc_40101A

.text:004010FB ; ---------------------------------------------------------------------------

.text:004010FB

.text:004010FB loc_4010FB:                             ; CODE XREF: _main+E7j

.text:004010FB push    offset aWrong                   ; "wrong!\n"

.text:00401100 call    sub_40134B

.text:00401105 add     esp, 4

.text:00401108 jmp     loc_40101A

.text:0040110D ; ---------------------------------------------------------------------------

.text:0040110D

.text:0040110D loc_40110D:                             ; CODE XREF: _main+57j

.text:0040110D push    offset aWrong                   ; "wrong!\n"

.text:00401112 call    sub_40134B

.text:00401117 mov     eax, stru_408090._cnt

.text:0040111C add     esp, 4

.text:0040111F dec     eax

.text:00401120 pop     edi

.text:00401121 pop     esi

.text:00401122 pop     ebp

.text:00401123 mov     stru_408090._cnt, eax

.text:00401128 pop     ebx

.text:00401129 js      short loc_401135

.text:0040112B inc     stru_408090._ptr

.text:00401131 add     esp, 60h

.text:00401134 retn


当输入17个1时eax对应的是,34个这个,可以推测,1对应的是3 1,


然后输入1234那些测试发现每个都有对应的,接下来就是暴力把表对应出来,目标是0-9,a-z,A-Z,写了个python,每17个输出一个,然后放到程序里输出对应的,得到ida里复制来的,再解析

0   3 , 0
1   3 , 1
2   3 , 2
3   3 , 3
4   3 , 4
5   3 , 5
6   3 , 6
7   3 , 7
8   3 , 8
9   3 , 9
A   4 , 1
B   4 , 2
C   4 , 3
D   4 , 4
E   4 , 5
F   4 , 6
G   4 , 7
H   4 , 8
I   4 , 9
J   4 , a
K   4 , b
L   4 , c
M   4 , d
N   4 , e
O   4 , f
P   5 , 0
Q   5 , 1
R   5 , 2
S   5 , 3
T   5 , 4
U   5 , 5
V   5 , 6
W   5 , 7
X   5 , 8
Y   5 , 9
Z   5 , a
a   6 , 1
b   6 , 2
c   6 , 3
d   6 , 4
e   6 , 5
f   6 , 6
g   6 , 7
h   6 , 8
i   6 , 9
j   6 , a
k   6 , b
l   6 , c
m   6 , d
n   6 , e
o   6 , f
p   7 , 0
q   7 , 1
r   7 , 2
s   7 , 3
t   7 , 4
u   7 , 5
v   7 , 6
w   7 , 7
x   7 , 8
y   7 , 9
z   7 , a
"   2 , 2

然后解析esi寄存器的那个"437261636b4d654a757374466f7246756e"

最后输出为CrackMeJustForFun,一看就是肯定是他了,毕竟是一句自己看得懂的句子,输进去,success!



写的比较乱,毕竟自己也是新手

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-6-17 22:43 被格式化法编辑 ,原因: 加个代码框
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 361
活跃值: (536)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
晴天aa 2018-6-18 21:06
2
0
good
雪    币: 870
活跃值: (2264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
s1ber 2018-7-27 14:09
3
0
写的好
游客
登录 | 注册 方可回帖
返回