神刀安全网

破解程序

最近我在面试中被要求破解一个程序,并且成功拿到了工作。

大家好,开了一个新博客我真是非常激动呐,于是我计划每周都要更新几篇文章。看了标题各位应该知道本文的大概内容了,这里我会讲述一个在土耳其的安卡拉面试的故事。

“软件安全工程师(Software Security Engineer)”——我申请的是这样一个职位,面试时候他们问了我一些低级的问题,有些我能答上来,还有些却不行。

然后他们给我发了一封邮件,其中包含了一个加密的程序(CRACK MEEE!)。回家之后我下载了它,打开发现需要一个密码来解锁,心想原来他们是要我找到这个密码。:)

乍看之下这是相当困难的一件事,不过下面我会介绍破解过程中一些主要的概念。:)

第一件事就是在终端中执行程序

[email protected]:~# ./CrackTheDoor

*** DOOR CONTROL SYSTEM ***

PASSWORD:

我随手尝试了几个愚蠢的密码,3次之后,它就退出了。:)

再尝试用工具去分析它,比如获取文件信息:

[email protected]:~# file CrackTheDoor

CrackTheDoor: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),

dynamically linked (uses shared libs), for GNU/Linux 2.6.15,

BuildID[sha1]=0x9927be2fe310bea01d412164103b9c8b2d7567ea, not stripped

[email protected]:~#

于是我们就得到了关于这个二进制包更详细的信息:)

接下来:

[email protected]:~# ldd CrackTheDoor

linux-gate.so.1 => (0xf777b000)

libc.so.6 => /lib32/libc.so.6 (0xf760c000)

/lib/ld-linux.so.2 (0xf777c000)

[email protected]:~#

哎呀,顺手就打了这个命令。我稍微解释一下, linux-gate.so 这个文件应该可以在你的电脑上找到。从ldd命令的结果可以看出它是一个共享库对吧?那么你们听说过Virtual DSO(Virtual Dynamic Shared Object)吗?

这里建议阅读一下关于的 linux-gate.so 详细介绍

libc.so.6 是GNU系统上一个通用的C语言库,这个你们可能都知道。

ld-linux.so 是linux的动态加载器。

到目前为止一切都还算顺利, 那么使用调试器来运行这个程序试试:

[email protected]:~# gdb CrackTheDoor

GNU gdb (GDB) 7.4.1-debian

Copyright (C) 2012 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html> ;

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type “show copying”

and “show warranty” for details.

This GDB was configured as “x86_64-linux-gnu”.

For bug reporting instructions, please see:

< http://gnu.org/licenses/gpl.html> ;

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type “show copying”

and “show warranty” for details.

This GDB was configured as “x86_64-linux-gnu”.

For bug reporting instructions, please see:

< int main() { if (ptrace(PTRACE_TRACEME, 0, 1, 0) < 0) { printf("DEBUGGING... Bye/n"); return 1; } printf("Hello/n"); return 0; }

顺便说一句,你只能使用一次ptrace[PTRACE_TRACEME]。因此如果调试器在这之前使用ptrace,那么我们的调用就会返回false,于是就能知道还有其他东西在控制程序了。

现在需要做的是绕过ptrace保护机制,使程序无法检测到自己运行在调试器中。

所以一个可能的策略是改变这个系统调用的返回值。

系统调用是用户态与核心态之间的桥梁,于是可以确定ptrace中一定用到了一些系统调用来控制进程。

我们希望检测到程序使用ptrace,并且设置它的返回值为0:)

我在home目录下建立了一个文件叫.gdbinit,这样一来,当运行gdb的时候,其中的配置信息就会被自动加载。

~/.gdbinit

set disassembly-flavor intel # Intel syntax is better

set disassemble-next-line on

catch syscall ptrace #Catch the syscall.

commands 1

set ($eax) = 0

continue

end

寄存器EAX会保存系统调用的返回值,这样它就永远都是0了,或者说是true。

通过这种方式,我们绕过了反调试机制,那就回到gdb继续吧:

[email protected]:~$ gdb ./CrackTheDoor

GNU gdb (GDB) 7.4.1-debian

Copyright (C) 2012 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later < http://gnu.org/licenses/gpl.html> ;

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type “show copying”

and “show warranty” for details.

This GDB was configured as “x86_64-linux-gnu”.

For bug reporting instructions, please see:

< void PJeGPC4TIVaKFmmy53DJ (int * p) { int array[] = {0xe4,0x87,0xfb,0xbe,0xc9,0x93,0x84,0xfc, 0x8d,0xe5,0xbf,0x5c,0xe2,0x76,0x21,0xb8} for(i=0;i<16;i++) { p[i] = p[i] ^ array[i] } } int X1bdrhN8Yk9NZ59Vb7P2(int * p) { int array = {0xd9,0xcd,0xc9,0xe5,0x9e,0xd0,0xe8,0xa5, 0xaf,0x87,0xd2,0x79,0xa9,0x5d,0x7,0x81} for(i=0;i<16;i++) { if(p[i] != array[i]) return false; // fail.. } return true }

于是写了一个简单的python脚本将上面两个常量进行异或操作,就得到密码了:

#!/usr/bin/python

firstConst = [0xe4,0x87,0xfb,0xbe,0xc9,0x93,0x84,0xfc,0x8d,0xe5,0xbf,0x5c,0xe2,0x76,0x21,0xb8]

secondConst = [0xd9,0xcd,0xc9,0xe5,0x9e,0xd0,0xe8,0xa5,0xaf,0x87,0xd2,0x79,0xa9,0x5d,0x7,0x81]

ret =”"

for x in range(16):

ret+=chr(firstConst[x] ^ secondConst[x])

print ret

[email protected]:~$ ./CrackTheDoor*** DOOR CONTROL SYSTEM ***PASSWORD: =J2[WClY”bm%K+&9*** ACCESS GRANTED ***

*** THE DOOR OPENED ***

看!成功了!

这个公司又给我发来了第二轮的破解题目,也一样很有趣,下次我会在文章中写到的。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 破解程序

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
分享按钮