|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=564 [복사]
달고나님의 문서를 보면서 따라해보고 있는데요
이 문서를 보면 execve 안에서 레지스터에 값들을 넣어준후 int 0x80으로 system call을 호출하는 인터럽트를 발생시킵니다
그런데 gcc version 4.6.1인 제 컴퓨터에서 objdump 해보면 다른 어셈블리 코드는 다 똑같은데
int 0x80이 있어야 할 부분에 call *0x80d70b0이 있습니다.
objdump -d shell | grep 80d70b0 해봐도 call하는 부분은 많은데 그 주소에 뭐가 있는지는 나오지 않습니다
아무래도 다른 프로세스 안의 instruction을 호출하는 것 같습니다
또, c에서 인라인 어셈블로 코딩 해봐도
"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"
는 잘 되지만
"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"
"call *0x80d70b0\n\t"
처럼 마지막줄을 바꾸면 세그멘테이션 오류만 발생합니다...
왜 그런지 한수 가르쳐주시면 감사하겠습니다... |
Hit : 3579 Date : 2012/04/23 11:49
|