949, 1/48 회원가입  로그인  
   rlaheehoon
   http://blog.naver.com/rlaheehoon
   BOF shell code 만드는데 질문이 있습니다

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



    
멍멍 컴파일러가 최적화를 한 것 같네요 volatile 키워드를 붙여서 컴파일해보세요
asm volatile("NOP") 이런식으로..
그리고 0x80d70b0엔 아마 함수테이블이 있을 겁니다. gdb를 이용하여 디버깅해보세요..
2012/04/23  
rlaheehoon 아 gdb로 하니 잡히네요
몇십줄 따라가보니 int $0x80이 있긴 있네요 무슨 최적화 작업을 하는건지 복잡해서 모르겠습니다만 ㅋㅋ
objdump와 gdb가 뭔지 정확히 공부해 봐야겠습니다

답변 감사합니다~
2012/04/25