不能忘记逆向未知/恶意代码的基本规则。Always work on non-production machines, on a network segment specifically designed to contain the trojan's traffic. 安全忠告到此结束,利用到Wine可执行文件的路径作为gdb的变量,启动gdb。在我的系统上,我将运行如下命令:
gdb /usr/bin/wine.bin
接下来将产生下面的结果。(敲入命令回车后,在gdb启动后在下面以粗体显示,红色内容是作者的笔记)
GNU gdb 5.2.1-2mdk (Mandrake Linux)
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i586-mandrake-linux-gnu"...(no debugging symbols found)...
(gdb) set args ./trojan.exe
为gdb提供一个变量;载入木马名。
(gdb) b PROCESS_InitWine
翻译(Set a breakpoint when Wine begins. This is to allow us to set breakpoints later on which are )
currently
inaccessible since the code has not been loaded into memory yet)
在wine开始运行时,设置断点。因为这些代码还没有载入内存中,这样就允许以后我们在不可接近的代码处设置断点。
断点1:0x80486d0
(gdb)运行
程序运行
启动程序: /usr/bin/wine.bin ./trojan.exe
(no debugging symbols found)...(no debugging symbols found)...
(no debugging symbols found)...(no debugging symbols found)...
(no debugging symbols found)...(no debugging symbols found)...
Breakpoint 1, 0x400eea46 in PROCESS_InitWine () from /usr/lib/libntdll.dll.so
(gdb) b SYSDEPS_SwitchToThreadStack
在Win32可执行程序入口点设置断点。在到达这个断点后,我们就可以在0x40a0ab设置目标断点。
断点2 :0x400f4d66
(gdb)c
继续执行这个程序
继续。
Could not stat /floppy (No such file or directory), ignoring drive A:
Breakpoint 2, 0x400f4d66 in SYSDEPS_SwitchToThreadStack () from /usr/lib/libntdll.dll.so
(gdb) b * 0x0040a0ab
(在htonsAPI调用前的偏移地址处设置断点。当在偏移地址处设置断点后,不要忘记偏移地址的前缀星号*)
断点3:0x0040a0ab
(gdb)c
(继续执行程序)
Continuing.
Breakpoint 3, 0x0040a0ab in ?? ()
(我们已找到最后一个断点并且停止在木马的主子程序,这个子程序仅仅就在htons调用之前。EAX中应当包含我们的端口号)
(gdb) print/x (short) $eax
(显示出寄存器EAX中的值)
$1 = 0x4b8c
(我们的端口号,以十六进制数表示。0x4b8c转化成十进制为19340)
(gdb)quit
这样,不需要在deadlisting跟踪无数的子程序,我们就可以确定出木马将在端口19340开放一个监听器。
coroner的报告
这里,我们仍可继续读the deadlisting 并通过设置断点直到程序的每个函数都运行后,来获取gdb中的变量内存信息填充我们对程序认识的空白。很明显,这篇短文不能涉及到即使一个很小的木马的所有函数,但令人欣慰的是,它为你提供了如何自己亲自去分析木马的信息,使得仅需一点汇编、C知识、一点运气以及再多一点耐心就可以征服一个木马。刚开始,你看到thousands upon thousands 数千汇编代码后,就感到困惑,但实际上可以凭经验容易地来处理这些代码。最终你将会从整体角度找到程序的范式,从而从一行一行代码分析中解脱出来,似乎就好像是你不用读代码就能‘感受’到它。
关于木马
上面代码是从建立在约定系统上的Win32后门得到的。连接监听器将产生一条提示“Barvinok NT Shell v1.0”以及密码输入框。密码是以二进制形式的硬编码并可以在“字符串”输出是可读的。在键入密码后,你就能进入基本的NT命令行核。