注册 登录
编程论坛 汇编论坛

关于著名的191个字节BINDSHELL的疑问?

发布于 2012-01-13 10:58, 668 次点击
对“191个字节的bindshell”一处代码很困惑,希望大牛指点一下

P139页第二行代码:  sub edi, 0x6c;
此时edi 应该指向的是STARTUPINFO结构中的hStdInput,然后设置输入输出句柄为Socket
不过我对这个 0x6C 十分不解:
STARTUPINFO的结构如下, 大小为44h,

代码:
typedef struct _STARTUPINFO {  
  DWORD cb;  
  LPTSTR lpReserved;  
  LPTSTR lpDesktop;  
  LPTSTR lpTitle;  
  DWORD dwX;  
  DWORD dwY;  
  DWORD dwXSize;  
  DWORD dwYSize;  
  DWORD dwXCountChars;  
  DWORD dwYCountChars;  
  DWORD dwFillAttribute;  
  DWORD dwFlags;  
  WORD wShowWindow;  
  WORD cbReserved2;  
  LPBYTE lpReserved2;  
  HANDLE hStdInput;  //hStdInput起始位置距离STARTUPINFO结束位置为0xc个byte
  HANDLE hStdOutput;  
  HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
在P137页倒数第5行开始:

代码:
lea ecx, [eax+0x30]; //此时eax=0;
mov edi,esp
rep stosd
以上几句初始化出一STARTUPINFO结构体,而esp则指向的是STARTUPINFO的起始位置,edi=esp+0x30*4=esp+0xc0
所以当设置STARTUPINFO中的参数时,sub edi, 0x6c, 为什么edi就指向hStdInput,我很疑惑???

hStdInput距离STARTUPINFO结构的起始位置为0x38, 我将sub edi, 0x6c 改为 lea edi,[esp+38h]也能运行成功,
不过对应的机器码多了一个字节
如果EDI-0X6C=ESP+38H,那么EDI=ESP+38H+0X6C=ESP+0XA4,与edi=esp+0x30*4=esp+0xc0就矛盾了?
2 回复
#2
你们都要疼我哦2012-01-13 15:53
有分呀。。。
楼主太愁人了,这个 还是要静下心来自己调试。
上次回复已经说了 ESP来寻址很麻烦,用EDI相对来说不容易出问题。更重要的是
这些知识仔细看书 联系上下文 是远远不够的 你不动手调试 你不一步一步的在OD里
跟,是很难以理解。

你的思维还停留在静止的源代码状态,还没有一个正确的 动态调试 概念,
这样很难真正进步。

回到这个问题,
C0大小的地儿已经知道,起始地址及结束地址也已经知道,
结构体大小及内部偏移也已经知道,你在OD里更可以看到
它们的一切,
但是假如需要对结构体内进行寻址,取某一时刻esp或者EDI的值,
然后你要自己  计算 出需要加减多少才可以定位到需要的地方,
寄存器内容都是在动态变动的,当你取值进行定位时,它们的值很可能
已经不是当初刚填充完的时候那个值,要根据寄存器当前实际值来确定所需的加减数,
所以你不要纠缠于什么6C 38,更不可能简单的左右换换就认为它们应该如何如何。

还是建议你能静下心来,认真的动手调试,同时把基础知识适当的补充一下。
#3
zaixuexi2012-01-13 21:56
有些人静态分析能力差,甚至没有,也就算了,连动态调试能力都没有,不是找骂么
1