能力值:
( LV5,RANK:70 )
|
-
-
2 楼
这个跟汇编指令call有关,call在call它的过程时,会将eip压入栈中,保存在[esp]中,所以只要修改了[esp]中的值使它指向其他位置,那么main函数在返回时就会跳到修改的值的指向的位置,而不是先前call之前压倒栈中的值。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
#include <stdio.h>
//ShellCode 2进制机器码.
static char shellcode[]=
"\xeb\x17\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89"
"\xf3\x8d\x4e\x08\x31\xd2\xcd\x80\xe8\xe4\xff\xff\xff\x2f\x62\x69\x6e"
"\x2f\x73\x68\x58";
int main() {
int *ret;
此时的栈情况:
char *envp
char *argv[]
int argc
返回地址
EBP
局部变量 int *ret
ret=(int *)&ret+2: 执行完这句后 ret指向返回地址.因为ret是int型指
针.+2*int=+8字节
(*ret)=(int)shellcode; 将ShellCode的地址写到返回地址里.当main函数执行完之后
retn就跳到了Shellcode处执行.
return 0;
}
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
覆盖了返回地址,另外一些情况是覆盖了SEH Handler
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
看起来你也是刚刚起步哦
|
|
|