어셈블리어 코드 질문있습니다
글쓴이: qoqkwl6593 / 작성시간: 월, 2015/07/06 - 9:14오전
int main() { char *str[2]; str[0] = "/bin/sh"; str[1] = 0; execve(str[0], str, 0); }
위 c언어 코드를 어셈 코드로 변경한 것입니다.
.globl main main: jmp come_here func: movl $0x0b, %eax popl %ebx movl %ebx, (%esi) movl $0x00, 0x4(%esi) leal (%esi), %ecx movl $0x00, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx int $0x80 come_here: call func .string "/bin/sh\00"
main:
jmp come_here
func:
movl $0x0b, %eax // execve의 시스템 콜번호 11을 %eax에 넣음
popl %ebx // "/bin/sh"의 주소를 %ebx에 넣음(첫째인자)
movl %ebx, (%esi)
movl $0x00, 0x4(%esi) // 배열 포이터를 구현.["/bin/sh"의 주소][0]
leal (%esi), %ecx // 배열 포이터 시작 주소를 %ecx에 넣음(둘째인자)
movl $0x00, %edx // NULL을 넣음.(셋째 인자)
int $0x80 //시스템 콜 호출 인터럽트 발생
movl $0x01, %eax //여기서부터 exit(0)을 구현
movl $0x00, %ebx
int $0x80
이렇게 되어있는것을 그대로 작성해보았습니다.
제 리눅스가 세그먼트폴 오류를 자꾸발생시켜서.
Error
Segmentation fault (core dumped)
이유좀 알려주시면 감사하겠습니다.
Forums:
int main() { char
int main()
{
char *str[2];
str[0] = "/bin/sh"; // str[0] 는 char * 형인데 영역이 할당되어 있지 않습니다. 세그먼트 폴트를 일으킬 겁니다.
// str[0] = malloc(100); 등으로 초기화 필요
str[1] = 0; // str[1] = NULL 과 같습니다. 문제없음
execve(str[0], str, 0);
}
?
str[0] 포인터에 전역(.data) 읽기전용 문자열 "/bin/sh" 의 주소를 할당하는
"정상적인" 연산인데 세그먼테이션 폴트가 뜰 이유가 전혀 없습니다.
?
그대로 작성하셨다는 것을 어떻게 작성하셨는지 내용을 보여주시고 컴파일을 어떻게 하셨는지 좀 더 구체적으로 글을 써주세요.
작성하신 원본 소스코드의 테스트를 위해 gcc의 -g
작성하신 원본 소스코드의 테스트를 위해 gcc의 -g 옵션(디버깅 옵션)을 포함하여 컴파일 한 후 core 파일을 생성하기 위해 ulimit 명령어를 사용하여 테스트 환경을 만듭니다.
segfault의 원인 파악
gdb로 확인 결과 %ebx를 %esi의 상대주소에 복사하려 하지만 %esi의 상대주소는 0x00000000 이므로 segfault를 일으킵니다.
%esi를 사용하지 않고 stack에 "/bin/sh"의 주소를 저장했다가 뽑아오는 방식으로 변경하려 합니다.
변경된 부분에 대해서는 %esi 레지스터를 사용하여 execve()의 2번째 인자를 만들지 않고 stack을 사용하여 "/bin/sh"의 주소를 push 했다가 esp를 사용하여 해당 주소를 얻어오는 방식으로 변경해 보았습니다.
테스트 한 머신은 CentOS 5.3 + gcc 4.1.2 + 커널버전 2.6.18-128.el5 입니다.
아래는 변경된 소스코드입니다.
참조 바랍니다.
댓글 달기