首页
社区
课程
招聘
[求助]对“191个字节的bindshell”一处代码很困惑
发表于: 2008-7-26 17:09 5388

[求助]对“191个字节的bindshell”一处代码很困惑

2008-7-26 17:09
5388
对“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]也能运行成功,
不过对应的机器码多了一个字节

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
代码列出来看看
2008-7-26 17:49
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
3
用OD调试可知,执行到这里时,
inc byte ptr [esp + 0x2d]   ;set STARTF_USESTDHANDLES(0x100) to true
sub edi, 0x6c               ;point edi at hStdInput in STARTUPINFO

寄存器的状态如下:
esp=0x12fc4c, esp+0x2d=0x12fc79, hStdInput=esp+0x38=0x12fc84
edi=0x12fcf0, edi-0x6c=0x12fc84

可见此时 esp+0x38 和 edi-0x6c 的值是一样。
2008-7-26 21:14
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
多谢 vxasm 啊,现在知道问题出在哪里了
2008-7-27 23:59
0
雪    币: 212
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
我的为什么不能运行总是抛出异常说是内存读取错误呢?
2009-7-25 12:16
0
游客
登录 | 注册 方可回帖
返回
//