바이너리의 소스 코드는 이렇고 환경에서는 ASLR이 걸렸있다.
ROP를 이용해서 풀 수 있지만 다른방법으로 풀 것이다.
우선 strcpy() 함수는 char * strcpy(char * dest, const char * src); 이렇게 구성되어 있는데 strcpy() 함수의 리턴 값은 문자열 dest에 대한 포인터이다. 그럼 이 함수를 이용해 문제를 풀어보자 (NX가 걸려있지 않기 때문에 쉘코드가 가능하다. )
버퍼가 64이기 때문에 72개를 넣어주면
strcpy() 때문에 EAX에 버퍼 값을 가리키는 포인터 주소가 들어간다.
EIP도 90909090으로 되어있다.
현재 EAX레지스터 값을 실행할 수 있으면 쉘코드를 실행할 수 있다는 소리다. 근데 ASLR이 걸려있는데 어떻게 실행할까 call %eax라는 가젯을 이용하면 된다!
call %eax를 호출하게 되면 현재 EAX값을 EIP에 복사하여 실행할 수 있다.
가젯을 구했으니
페이로드 구성은 [쉘코드][나머지 버퍼][eax함수 호출] 직접해보면
현재 EAX는 쉘코드를 넣은 상태라 \x31\c0\50\68을 가르키고 있다.
함수 내부로 들어가게되면 EIP가 EAX와 같아 진걸 볼 수 있다.
이렇게 쉘코드를 실행할 수 있게된다.
'CTF > Write-up' 카테고리의 다른 글
codegate 2013 vuln200 (0) | 2017.01.08 |
---|---|
Layer7 ctf 2015 IhaveLongDariYouHaveShotDari (6) | 2017.01.07 |
NEWSECU CTF Write-up (0) | 2017.01.01 |
holyshield ppc (0) | 2016.12.24 |
holyshield BrokenPiano (0) | 2016.12.22 |