这个crackme还算是比较简单的,没有壳,只有一个简单的linux终端输入界面,输入正确密码即出现成功的提示。
首先用root用户打开一个终端。
objdump -x crackme
可以看出一些信息:start address 0x08048370,GLIBC_2.0 ,调用了C库 libc.so.6
再进一步的查看程序信息
objdump -t crackme > crackmeinfo.txt
接着反汇编
objdump -d crackme > crackmefree.txt
产生的crackmefree.txt 文件并没有像在windows上那样顺眼,没有什么提示
所以改用edb,这个跟OD的风格很像。
F9运行,在输入密码“12345678”后,F8单步跟进,发现在0x804845e下断比较好,所以重新run
0x804845e <main+14>: call 0x804835c <printf@plt> ;&quot;Linux CrackMe (Level:2) by cyrex&quot;
0x8048463 <main+19>: add $0x10,%esp
0x8048466 <main+22>: add $0xfffffff4,%esp
0x8048469 <main+25>: push $0x8048660
0x804846e <main+30>: call 0x804835c <printf@plt> ;&quot;TODO: You have to get the valid Password&quot;
0x8048473 <main+35>: add $0x10,%esp
0x8048476 <main+38>: add $0xfffffff4,%esp
0x8048479 <main+41>: push $0x8048690
0x804847e <main+46>: call 0x804835c <printf@plt> ;&quot;Enter Password:&quot;
0x8048483 <main+51>: add $0x10,%esp
0x8048486 <main+54>: add $0xfffffff8,%esp
0x8048489 <main+57>: lea -0x20(%ebp),%eax
0x804848c <main+60>: push %eax
0x804848d <main+61>: push $0x80486a1
0x8048492 <main+66>: call 0x804832c <scanf@plt> ;输入错误的密码12345678
0x8048497 <main+71>: add $0x10,%esp
0x804849a <main+74>: add $0xfffffff8,%esp
0x804849d <main+77>: push $0x80486a4
0x80484a2 <main+82>: lea -0x20(%ebp),%eax
0x80484a5 <main+85>: push %eax
0x80484a6 <main+86>: call 0x804831c <strcmp@plt> ;跟进去step into
**************************************
;&quot;step into:
................
mov ecx, dword ptr [esp+4]
mov edx, dword ptr [esp+8]
mov al, byte ptr [ecx]
cmp al, byte ptr [edx]
jnz 0xb75e97c7
inc ecx
inc edx ;edx里出现了&quot;47ghf6fh37fbgbgj&quot;,显然这就是password了
test al, al
jnz 0xb75e97b8
xor eax, eax
ret
mov eax, 1 ;因为输入&quot;12345678&quot;,所以eax=0xffffffff
mov ecx, -1
cmovb eax, ecx
ret ;返回eax=0xffffffff
**************************************
;call 0x804831c 返回eax=0xffffffff
0x80484ab <main+91>: add $0x10,%esp
0x80484ae <main+94>: mov %eax,%eax
0x80484b0 <main+96>: test %eax,%eax ;判断password是否正确
0x80484b2 <main+98>: jne 0x80484c6 <main+118>
0x80484b4 <main+100>: add $0xfffffff4,%esp
0x80484b7 <main+103>: push $0x80486c0
0x80484bc <main+108>: call 0x804835c <printf@plt> ;打印&quot;Good, You're ready to begin linux reversing&quot;
0x80484c1 <main+113>: add $0x10,%esp
0x80484c4 <main+116>: jmp 0x80484d6 <main+134>
0x80484c6 <main+118>: add $0xfffffff4,%esp
0x80484c9 <main+121>: push $0x8048700
0x80484ce <main+126>: call 0x804835c <printf@plt> ;打印&quot;Ohhhh, your skills are bad try again later&quot;
0x80484d3 <main+131>: add $0x10,%esp
0x80484d6 <main+134>: xor %eax,%eax
0x80484d8 <main+136>: jmp 0x80484e0 <main+144>
0x80484da <main+138>: lea 0x0(%esi),%esi
0x80484e0 <main+144>: leave
0x80484e1 <main+145>: ret
**************************************
一轮调试,初步得出&quot;47ghf6fh37fbgbgj&quot;就是密码了。所以,直接 ./crackme ,输入&quot;47ghf6fh37fbgbgj&quot;,呵呵,good,追踪成功。 |