|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


1576, 1/79 |
![]() |
![]() |
![]() |
![]() |
|
hsuser | ||||||
|
buffer overflow 질문 | ||||||
|
http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1687 [복사]
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 | |
|
|