시스템 해킹

 1576, 1/79 회원가입  로그인  
   intmain1202
   버퍼오버플로우 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1489 [복사]


void main(){

__asm__(
"push $0x0 \n\t"
"push $0x0068732f \n\t"
"push $0x6e69622f \n\t"
"mov %esp, %ebx \n\t"
"push $0x0 \n\t"
"push %ebx \n\t"
"mov %esp, %ecx \n\t"
"mov $0x0, %edx \n\t"
"mov $0xb, %eax \n\t"
"int $0x80 \n\t"
);
}

인라인 어셈으로
/bin/sh 를 실행하는 어셈소스입니다.
그런데 저기
"push $0x0 \n\t"
"push %ebx \n\t"
이부분이 필요가 없을것같은데 안넣으면 세그먼트 폴트가 일어나네요
왜 저부분을 곡넣어야될까요?
뒤에서 push로 인자값들을 메모리에 올리고 그아래로 레지스터에 값들을 넣는대도 말이죠...
왜그런건가요??!!

  Hit : 3411     Date : 2011/05/28 11:56



    
별빛을담아 저게 별거 아닌거 같지만 사실 push라는 명령어가 들어갈 공간이
차지 하고 안하고라는 차이가 있죠.

만약 모든 명령어가 1바이트라면... 위에 쓴 명령어는 총 10바이트겠군요
근데 여기에서 맨 위에 있는
push $0x0 \n\t
push %ebx \n\t
두개의 코드를 빼버리면 명령어만 총 8바이트가 되는거죠.

push명령어가 몇바이트 명령어이고 mov가 몇 바이트명령어인지 모르겠지만..

ftz에서 gdb로 disass를 해 보셨다면 push로 0을 넣는 명령어가 메모리 주소에 +1시킨다는 것을 볼 수 있습니다.
2011/05/29  
intmain1202 별빛님 말씀대로라면... 꼭 10바이트가 되어야된다는 건가요?
그러진 않을것같은데.....
메모리에 /bin/sh를 푸쉬햇을때 esp는 어짜피 그아래서 /bin/sh를 주소를 가르킬테고..
그럼 바로 mov %esp, %ebx
push 0x0 push %ebx안해도 될것같은데..
왜 저런 과정을 거치는건지 모르겟네요;;
2011/05/29  
profreez int execve(const char *filename, char *const argv[], char *const envp[]);

execve("/bin//sh", ["/bin/sh", NULL], [NULL])

위 함수 인자를 보시면 됩니다.

argv 부분에 "/bin/sh"를 가르치는 포인터와 끝을 나타내는 NULL(0)이 필요합니다.
그래서 0을 넣었군요.
2011/05/29  
profreez 해킹 공격의 예술 이라는 책 셸코드 부분을 참고 하시면 될듯 싶습니다.
개정판 기준으로 425페이지 참고 하세요.

개인적으로 저책 개정판의 장점은 자세한 설명과 라이브 시디가 좋고
1판은 책이 ㅇㅏㄼ아서 좋더군요. 개정판은 가지고 다니기엔 너무 두꺼워요ㅡ.ㅜ

1판도 하나 사둬야겠네요 ㅎ
2011/05/29