以下是引用hb0zyj在2012-1-9 09:25:10的发言:
关于有名的191个字节的bindshell代码:
mov eax,0x0
lea ecx,[eax+0x30]
mov edi,esp
rep stosd
....
书上说,为将栈上一大片区域置成NULL,才有了上述代码。关键是第二句:lea ecx,[eax+0x30]与某结构体的大小0X44有关,怎么理解?
没分。。。这个不太好吧。。。
这个你要联系上下文 有时候光联系上下文还不够 还需要自己动手调试才行。
rep stosd 按4字节填充
ecx为计数器
edi为起始地址
这样填充完以后 edi为esp+0x30*4,
某结构体大小为0X44,假如填充完成后,
需要用EDI寻址结构体内地址,就要减去一个值,
根据所需结构体内的不同地址,减去不同的值。
当然也可以从起始地址开始加,但是那样就体现不出灵活性。
上面的相信你都早已理解,我就是没事温习一下指法。
你的问题是 它们为什么“有关”。。。
实际上它们是相对无关的,作为填充的大小,可以是
超过0X44的任何允许值,
但是当完成后,需要用edi来寻址结构体内位置时,就需要计算具体偏移了。
当然 用0X30个dw可能是比较合适的,也许是这个结构体就固定用这么多的地儿来盛。。。
这样的数据是 自己构造 出来的,倒着减 正着加,只要能定位到需要的地方怎么样都行,但是有时候用esp不保险,在这里是用edi。
这个似乎是个很简单的问题。。。。。。
不摸汇编几百年了 啥都忘了