시스템 해킹

 1576, 1/79 회원가입  로그인  
   hsuser
   buffer overflow관련 질문

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


학교 과제 중 버퍼오버플로우에 관한 질문입니다.
void example()
{
   int val;
   val=getbuf();
   if(val==val2){
       print("buffer overflow");
   }else
       printf("return 1\n");
}

이런 형식의 함수입니다. 실행파일만 가지고 있구요.
getbuf 함수는 gets함수를 사용해 buf에 저장하고 retrurn 1을 해줍니다.
gdb를 돌려보니 example함수에서 val 은 레지스터에만 저장되고 스택에 저장되지 않는 것으로 보입니다.
그래서 getbuf함수에서 return을 val2로 수정하여야하는데 이 부분에서 막히네요.
과제에 advice내용으로는 instructions 과 data를 stack에 넣고 돌리는 방법인 것 같습니다.
그런데 32bit 에서 stack frame이 4byte씩 아닌가요. objdump를 이용해 assembly code를 보면
5bytes 명령어도 있고 더 긴 것도 있던데 stack frame에 들어가도 실행이 잘되는지;;
이 부분이 잘 모르겠습니다.ㅜㅜ

  Hit : 3624     Date : 2013/06/19 12:13



    
kumi123 정리좀 해주세요.. 뭘 원하시는지 잘 모르겠네요.

getbuf() 함수도 같이 올려주셔야죠..
2013/06/20  
Silk 제가 이해한 바로는 getbuf에서 getbuf함수의 지역변수인 buf에 오버플로우를 일으킬수 있다는 말 같고,,
오버플로우를 일으키면 return address를 덮을 수 있으니까 이를 이용해서 return value를 수정하고싶다..이런거 같네요.

일단 return value는 항상 eax로 들어가고 후에 나오는 val1 , val2의 비교도 선언된 변수가 아니라,
eax == 상수(학번) 이런식일 것 같네요.

그렇다면 getbuf함수를 overflow시켜서 쉘코드를 실행하게 하면 됩니다.

과제의 제한사항이 또 뭐가 있는지 모르겠지만 DEP나 ASLR 등이 걸려있지 않다면
단순히 쉘코드를 buf에 올려서 실행시키는게 가능합니다.

쉘코드의 내용은
mov eax, 상수(학번) ; call [ getbuf 함수의 호출이 끝난 바로 직후 instruction주소 ]
가 되면 됩니다.

스택프레임이 4바이트고 objdump로 보니까 5바이트 명령도 있다.. 머 이런 말씀을 하셨는데.
제 생각엔 이 부분은 아직 어셈블리나 시스템 아키텍쳐에 대한 이해가 부족하신 것 같습니다.
2013/06/21  
hsuser ㅠ_ㅠ질문이 모호했던 점 죄송합니다
그럼에도 불구하고 답변 감사드립니다 :)
쉘코드에 대한 개념이 없어서 헤멘 듯 하네요
2013/06/21