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

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

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

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-7-26 17:49
2
0
代码列出来看看
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
vxasm 6 2008-7-26 21:14
3
0
用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 的值是一样。
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mingjiang 2008-7-27 23:59
4
0
多谢 vxasm 啊,现在知道问题出在哪里了
雪    币: 212
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wushaojie 2009-7-25 12:16
5
0
我的为什么不能运行总是抛出异常说是内存读取错误呢?
游客
登录 | 注册 方可回帖
返回