ASLR 적용 된 바이너리 ASLR 해제하기~

2017. 12. 6. 22:350x04 pwnable

728x90

오늘 진행해 볼 삽질은 ASLR이 적용된 윈도우즈 프로그램을 해제하는 방법에 대해 설명해볼까합니다. 


ASLR(Address SpaceLayout Randomization) 


Windows XP 이상부터 적용되는 기법입니다.

프로그램이 로드 되는 상대주소를 랜덤으로 바꾸어서 pwn하기에 어렵게 하는 기법이라고 합니다.


작업한 환경은 Visual Studio Community 2017 버전입니다.  


알고 계시면 좋은 것이 있는데 Visual Studio Community 2017버전은 기본적으로 빌드를 진행 하게 되면 임의주소로 컴파일이 되게 설정이 되어 있습니다. 그림을 보죠.



"임의 기준 주소"에 예가 되어있는 것이 ASLR 입니다. 

그렇다면 지금은 ASLR로 프로그램을 빌드 해야하기 때문에 그대로 설정 값을 유지하겠습니다.


테스트를 진행 할 코드는 이것입니다.


#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <Windows.h>


int main(int argc, char*argv[])

{

char arr[10];

int i = 0;


printf("ASLR Test\n");

printf("목표 ASLR을 우회하라!\n");

printf("문자열 입력 >> ");

scanf("%s",arr);


if (i == 0x12345678)

{

printf("Great!\n");

}

else

{

system("calc");

}

return 0;

}


OllyDBG를 통해 실행을 해보겠습니다. 


빠르게 메인의 시작지점으로 가보았습니다. 평소에 알고 있기론 4x 번대 주소가 메인의 시작지점이었습니다.

하지만, 임의의 주소를 사용하였기에 다음과 같은 주소가 나오게 되었습니다.

개인적인 생각이지만, 리버싱을 할 때는 주소가 변동 되는것이 별 상관 없지만, 포너블은 주소를 가지고 놀아야 한다고 들었습니다. 

그 주소를 가지고 놀기 위해서는 '가젯'이라는 아이들도 숙지를 해야 하고, 아이들의 정확한 집 주소도 알아야 한다고 들었습니다.




자 그렇다면, ASLR이 걸린 것을 동적으로 확인은 성공했습니다.


ASLR을 어떻게 하면 해제 할 수 있을까요? 

분명, 잠글 수 있으면 열 수도 있어야 할 텐데 몇 년전 대단하신 분들이 이미 그 방법을 연구해주셨고 

저희는 그 개념을 따라 하되, 이해만 하면 됩니다. 

언젠가 실력이 더 발전하면 직접 이러한 기법을 발견해야 하겠죠. 


우리는 이것을 "이미 알고있습니다" 

무엇일까요?? 


A : 바이너리는 정석으로 분석이 가능하면서, PE 구조까지 들여다 볼 수 있다. 


PE VIEW라는 프로그램을 적극적으로 이용해서 쓱 들여다 보겠습니다.


PE파일에서의 구조와 Memory에 매핑 된 상태의 구조는 유사하다. 




혹시 IMAGE_NT_HEADER라고 아시나요?

여기에 들어가게 되면 IMAGE_OPTIONAL_HEADER에서 아래의 사진을 찾을 수가 있습니다.



IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 라고 되어 있는 값에 0040이 있습니다.


Q: 이 값은 어디에 있나요? 그리고 이 값을 어떻게 지울 수 있을까요?


A:  답은 간단합니다. HxD와 같은 프로그램을 이용해서 메모리를 연 다음 살짝 지워주면 됩니다.


열어봅시다.


위의 사진에서 오프셋은 14E 이니까 오프셋 14E 위치로 가보게 되면 40 81이라고 되어있습니다 

어? 8140 아닌가요!! 하면 이제 혼나겠죠? Little Endian 방식을 이용하게 됩니다.


그럼 어떻게 8140이 나왔을까요?


0040 + 0100 + 8000 = 8140 입니다.




음 그렇다면 IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE가 0040이니까 여기 40만 없애려면 

8100이 되면 되겠군요 


리틀엔디언으로 0081이 되면 되는 것입니다.


앗. 한가지 팁이 있습니다. HxD로 작업할 때 PEVIEW에 로딩하면 패치할 수 없습니다.

반드시 프로그램 종료하고 패치해야합니다. 



패치 된 바이너리 실행 시켜보겠습니다



ASLR 걸려있다고 겁먹지 마시고 이렇게 진행하시면 됩니다. 

'0x04 pwnable' 카테고리의 다른 글

meltdown 취약점 혼자만의 정리 aka Psudocode  (0) 2018.01.14
ASLR 적용 된 바이너리 ASLR 해제하기 2~  (0) 2017.12.06
bof 기초  (0) 2017.11.27
rtl 공부 2  (0) 2017.11.27
rtl 공부  (0) 2017.11.27