티스토리 뷰

memcpy 취약한 함수를 사용하여 기본적인 Buffer Over Flow 취약점을 알아보겠습니다.


아래 소스는 BOF에 취약한 소스입니다. 메모리에 들어오는 길이 값을 검사하지 않아 생기는 취약점인데, 엄청 기본적인 방법이라 정리를 하고 가려고 합니다.


sBuf에 32를 할당하고, 0으로 초기화 시키고 있습니다. 

shellcode는 0x41414141 4바이트씩 맞춰서 결국 Return Addresss에 0x41414141이 뜨고, 그 곳으로 가게 하는 것이 목표입니다!




위의 소스를 디스어셈블하여 확인하면, 아래와 같습니다. 




EBP를 확인해보면 0012FF78 이라는 것을 확인할 수 있습니다.




MOV EBP, ESP를 통해서 EBP에 스택포인터가 전해졌고, [EBP-20] 을 할당 후에 0으로 모두 쓴 것을 확인할 수가 있습니다.




덤프코드에서 본 12FF58 - 12FF77 까지의 모습입니다. 


메모리 구조는 다들 아시겠지만,  [BUFFER - EBP - RETURN ADDRESS] 순으로 EBP와 RET에는 각각 4바이트로 명시가 됩니다. 12FF58부터 12FF78 전 까지가 우리가 할당해 준 버퍼이고 12FF78 -12FF7B 까지가 EBP이고 12FF7C 부터 12FF7F까지가 RET인 것을 확인할 수 있습니다. 우리의 목표는?? RET 4바이트 주소를 우리가 원하는 값으로 덮어 쓰는 것을 목표로 하고 있습니다.




현재 위의 그림에서 RET를 보면 0x00401141 이라는 주소를 볼 수가 있습니다. 이 주소는 바로 우리가 들어왔던 Main 함수의 Call 부분 다음의 주소를 명시하고 있습니다. 스택 구조를 보면, 다음 리턴 주소를 PUSH 하고 CALL 함수로 들어가기 때문입니다. 설명이 좀 부실한데, 스택 구조를 공부하시면 모두 이해가 됩니다.





디버거 기능에서 메모리 부분을 확인하면 40DDA0 은 우리가 만든 ShellCode가 저장되어 있는 

Data 영역입니다. 




덤프 코드 부분에서도 보면 40DDA0 주소에 4바이트씩 빽빽하게 들어간 것을 확인할 수가 있습니다.




아래 주소는 덮어 씌운 화면입니다. 12FF58 부터 12FF7C(RET) 까지 깔끔하게 덮어 씌웠습니다. 




EBP 와 EIP가 0x41414141로 변경된 것을 볼 수가 있습니다.  응용하여 shell code에 악의적인 코드를 입력하면?? 끝이겠죠.. 쉘 코드를 만드는 법도 포스팅 해보겠습니다.



도움 : 회사 내의 천재 리버서님..캬

'리버싱 > 정리' 카테고리의 다른 글

ShellCode 생성과정(cmd)  (0) 2016.10.30
ServiceMain 진입하기(LoadLibrary, GetProcAddress)  (0) 2016.10.17
VS2015 에서 어셈블리 개발환경 만들기  (0) 2016.01.06
RVA to RAW 계산  (0) 2015.12.29
[PE Image Switching 디버깅]  (0) 2015.08.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함