시스템 해킹

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

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


buffer overflow 에 대해 학교에서 수업을 듣고 과제를 하고 있습니다.

과제 내용은   example 이란 함수에 gets함수가 있습니다.

gets함수 호출 시 스트링을 입력하여 버퍼 오버플로우를 발생시킵니다

목적은 전역변수를 초기화 하고 지정된 함수 여기선 test를 불러 프로그램을  종료시키는 것입니다.

int a = 0;  //전역변수

int test(int val)
{
      if(a==b)
          프로그램종료
}

b 값은 임의로 과제에서 정해준 값으로 합니다

여기서 전역변수 a값을 버퍼오버플로우를 이용해 b 값으로 초기화를 한 다음에

test함수를 호출시켜 프로그램을 종료시켜야 합니다. Val값은 어떤값이든 상관없습니다

여기서 전역변수를 초기화 하는 방법을 잘 모르겟습니다


  Hit : 4140     Date : 2013/06/13 01:39



    
Silk 질문이 이해가 잘 안되네요.
전역변수 초기화는 왜 하나요? canary우회용인가요? 그래도 이해가 잘 안가구요.
정확한 소스나 앞뒤 문맥이 더 있으면 좋겠네요
2013/06/13  
hsuser 죄송합니다 수정했습니다 2013/06/13  
bmc12 전역 변수 초기화??

int test(int val) <= 여기서 val는 왜 선언된 거죠?


2013/06/14  
psh34 저만 이해가 안가는게 아니었군요. 2013/06/14  
hsuser ;;제가 질문글을 정말 못쓰는군요 ㅠㅠ val값은아무값이나넣어도됩니다
결론은 전역변수 a를 b로 초기화시킨다음에 test함수를 불러야하는데 방법을
잘모르겟습니다
2013/06/14  
Silk 음...관건은 a를 b라는 값으로 초기화 시키는거겠네요.
버퍼오버플로우가 어떻게 일어나는건지는 잘 모르겠으나,
일반적인 strcpy 함수등으로 일어나는 취약점이라면,

return address에 strcpy의 plt를 호출해서 a라는 전역변수에 값을 덮어 씌우고, test함수를 호출하면됩니다.

정확히 무슨말인지 아시려면 RTL 에 대해서 아셔야 하고, RTL을 이해하셨다면 RTL Chain을 연결한다는게 무슨말인지 알 수 있으실 겁니다.

즉,버퍼오버플로우를 일으키기 위한 취약점이 strcpy라면 페이로드는


[오버플로우를 일으키기위한 버퍼(n바이트) + EBP(4바이트) + strcpy@plt + test함수주소 + 전역변수a의주소 + b의 주소
이렇게 구성하시면 됩니다.
그러면 strcpy(a,b) , test() 가 호출되어 원하시는데로 작동할겁니다.

b가 상수인지 변수인지 모르겠으나, 상수라면 b값을 버퍼나 argv , 환경변수 등에 집어넣고 해당 주소를 넣으시면 됩니다. b 역시 전역변수라면 문제될게 없지만 지역변수거나 상수라면 aslr이 걸려있는 상황에서는 약간의 노력이 더 필요합니다.nx나 dep가 걸려있다면 rop를 해야할테고, 스택에 실행권한이 있다면 쉘코드로 대충 처리해버릴 수 있습니다.
2013/06/14  
hsuser 미숙한 질문에도 답변해주신 Silk님 답변 감사드립니다 :)
과제에서 b값은 저의 학번으로 정해져 있고 a를 제 학번으로만 초기화 하면 되는것입니다.
결국 과제는 a=학번 으로 만들고 test함수를 실행시키면 프로그램이 종료되는 것인데
strcpy방법 말고는 또 다른 방법이 있나요?

return address섹션이 call한 위치에서의 다음 instruction을 가리키는 것으로 알고 있습니다.
return address에 저장된 값이 가리키는 instruction을 '실행'시킨다고 보는데 이개념이 맞는건가요?
혹시 빈스택에 instruction값을 넣어놓은 상태에서 그 부분을 가리키는 주소값을 return address섹션에 저장하여
해당 instruction을 실행시키는 방법도 있나요?
2013/06/14