passcode 문제다.!

조금 시간이 걸렸다ㅜ
문제의 의도를 파악하는데 시간이 많이 들었다.!

passcode 문제 클릭!



(passcode 문제)



문제화면은 다음과 같다.


(문제)


로그인 프로그램을 만들었는데 어딘가 하자가 있는 모양이다.

소스코드를 확인하자!



(소스코드)



소스코드를 보니 멀쩡해 보인다.
뭘까?

실행해보자!



(로그인)



세그멘테이션 폴트?

이 문제를 알기위해 나는 나의 레드햇 32비트에서 소스코드를 컴파일하여 gdb를 통해 디버깅하였다.
그러던 중 신박한 사실을 알았다.

일단 문제의 원인은 scanf 에 있었다.



(문제의 원인)



바로 int passcode1 이 변수의 passcode1는 변수 주소이다. 그러기에 scanf에 넣을때 앞에 &를 붙여 주소를 표현해주어 그 변수 자리에 입력한 정수를 집어넣는 것이다.

디버깅한 어셈블리로 확인해보자!


(문제의 scanf)



바로 위에 빨간 박스가 문제이다.
원래는 그냥 [%ebp-4] 여야하는데 앞에 PTR이 붙었다. 그래서 ebp-4 위치에 있는 값을 주소로 인식하여 그 값의 주소에다가 그 다음 입력한 정수를 집어 넣으려 하니 segmentation fault가 나는 것이었다.

예를 들어 앞에 입력값 A 100개를 주면 아래와 같은 현상이 일어난다.



(이름으로 A 100개 입력)



그렇게 되면 0x41414141 위치에 입력받은 숫자를 저장하려할 것이고 여기서 에러가 나는 것이다.

여기 까지 왔을 때 문제의 의도를 파악했다.
그렇다면 마지막 0x41414141 대신 내가 원하는 주소값을 넣고
그 다음 숫자값으로 그 주소값에 내가 원하는 값을 넣을 수 있다는 말.!

정리해서 말하면 원하는 위치에 원하는 값을 4바이트 넣을 수 있다는 말이다!
그렇다면 그다음 호출되는 함수의 got를 오버라이트 해서 해결해보겠다!!!


(공격 타겟)



먹잇감이 포착됬다.
fflush이다.
여기다가 login 함수에서 system 함수를 호출하는 부분 (인자구성해주는부분포함해서) 그 쪽부터 시작되게 할 것이다.

그 위치를 파악하기 위해 objdump로 확인해보자!



(objdump)




(login 함수)



login 함수의 0x80485e3 위치부터 실행하면 비밀번호까지 얻을 수 있다. 고로 우리는 숫자 값에0x80485e3을 넣을 것이다. 

이제 fflush got 위치 찾기이다.
readelf 를 이용하여 파악해보자!



(3번째 위치)



바로 저게 got 영역에 들어있는 놈들인데 fflush가 3번째에 있다. 위치로는 got 시작영역부터 0x10 큰 위치가 fflush 위치가 된다.

그렇다면 fflush 위치는?


(GOT주소)



GOT 주소는 0x08049ff4 이므로 0x10 큰 0x0804A004 가 fflush 주소가 된다.

입력할 숫자 0x80485e3이 16진수이므로 10진수로 입력해야한다.
%d 가 10진수 표현이므로!




(10진수 표현)



이제 끝이다. 공격!




(공격)



이제 숫자를 입력한다!




(공격 성공)


'WarGame > 500 Project' 카테고리의 다른 글

(49/500) pwnable.kr - leg  (0) 2017.07.10
(48/500) pwnable.kr - random  (0) 2017.07.06
(46/500) - pwnable.kr - flag  (0) 2017.07.05
(45/500) - pwnable.kr - bof  (0) 2017.07.05
(44/500) - pwnable.kr - collision  (0) 2017.07.05


flag 문제이다!

문제를 풀다보면서 느낀거지만 조금 이 사이트 문제들이 짜임새 있다.
한단계 나가면서 조금씩 알아가는 느낌이 든다. :)

flag 문제 클릭!


(flag 문제)



문제를 보자


(문제 화면)



파파가 포장이된 선물을 주었다.
packed 라는 표현을 봐서 packing 된 실행파일인듯 하다. (느낌에)

일단 파일을 받아보자!



(파일 확인)



파일을 readelf 로 확인해보니 섹션이 없다.
패킹 되어있는 듯하다.

헥스 에디터로 확인해본다!



(바이너리 확인)



UPX로 패킹되어있는 것을 알 수 있었다.

먼저 UPX로 언패킹 해준다.



(언패킹)



그리고 다시 한번 확인해보자.



(flag 파일)



섹션 내용들이 자세히 나온다.
이제 디버깅 할수 있게 되었다.
그리고! 캡쳐는 깜빡했지만 실행하게되면
malloc을 실행하고 그 공간에 flag를 strcpy 할거야~ 라는 힌트가 나온다.

gdb를 열어 확인!


(main)


main 함수를 보니 malloc 함수가 호출되고 아래에 함수가 하나 더 호출된다.
함수가 하나밖에 없으니 보나마나다 이게 strcpy이다.

그러면 strpy하기 전에 break 하기!



(break 걸기)


자 이제 실행 한 후
실행 전 rax [eax] 를 확인한다.
-> 64비트에서는 함수 인자를 레지스터에 담아 넘기기 때문이다.
즉 rax 위치에 flag들이 복사될 것이다.   




(복사될 곳 확인)



strcpy까지 실행 후 이 주소의 값들을 보면 뭔가 채워져있다.



(flag)


이 값들을 string으로 보면 flag를 확인 할 수 있다.



(문제 해결)

'WarGame > 500 Project' 카테고리의 다른 글

(48/500) pwnable.kr - random  (0) 2017.07.06
(47/500) - pwnable.kr - passcode  (0) 2017.07.06
(45/500) - pwnable.kr - bof  (0) 2017.07.05
(44/500) - pwnable.kr - collision  (0) 2017.07.05
(43/500) - pwnable.kr - fd  (0) 2017.07.05



bof 문제이다!
bof 원정대의 실력을 꺼낼때가 됬다!

귀여운 너구리 클릭


(bof 문제)


문제화면이다.


(문제 화면)



remote bof? 
nc 로 접속하여 풀게 되어있다.
일단 취약한 프로그램을 한번 확인해보자.

소스 확인!


(소스코드)



소스코드를 보니 func 함수의 인자를 덮어 쓰면 될것 같다.

메모리에서 한번더 확인해보기 위하여 gdb에서 확인!



(메모리 상태)



입력으로 A를 여러개 주었을 때이다.
보면 위에 414141~~ 이 보이고 아래에 func 인자로 넘겨진 deadbeef가 보인다.
여기까지 덮어쓰면 되므로 일단 A 52개를 넣어보자!



(A 52개)


A 52개를 넣으니 딱 deadbeef 전까지 A가 채워졌다. 마지막은 Null 때문에 00이 덮여저있다.
여기에 이제 원하는 코드 를 넣으면 되니 이제 연결을 해보자!



(nc 연결)


전 문제 풀던 쉘에서 localhost로 바로 연결했다.

음! 이걸로 되겠군!

이제 표준입력으로 넘겨서 nc 로컬 연결할 것이다.



(공격!)


계획한대로 A 52개와 0xcafebabe 를 넣어준다. (엔디안 고려해서 뒤집어서 넣어준다.)



(성공!)



bof의 uid를 얻은 쉘을 획득했다.!




(문제 해결!)

'WarGame > 500 Project' 카테고리의 다른 글

(47/500) - pwnable.kr - passcode  (0) 2017.07.06
(46/500) - pwnable.kr - flag  (0) 2017.07.05
(44/500) - pwnable.kr - collision  (0) 2017.07.05
(43/500) - pwnable.kr - fd  (0) 2017.07.05
(42/500) - Lena's Tutorial 01  (0) 2017.07.05


collision 문제를 풀어보았다.
해쉬 충돌??



(collision 문제)


문제 화면



(문제화면)



이번엔 아빠가 등장 다음 문제는 형이 등장하나?
무튼
이번엔 아빠가 해쉬충돌을 이야기해주었단다. MD5 해쉬 충돌 문제인가?
그 동안 문제 풀면서 모은 MD5 충돌하는 매직해쉬값이 쓰일 날이 온건가!

소스코드를 보자.


(소스코드)



에이... 해쉬충돌이 아니다..!ㅎㅎ 
간단히 checksum 이라고해야하나. checksum은 아니고 
입력값을 다 더해준 값을 비교한다.

check_password 함수를 보면 입력값의 주소포인터를 받는데 
그 값의 주소 포인터니 4바이트씩 값을 가져가 더해주는 것이다.

총 20바이트여야하고 값은 총 합이 0x21DD09EC 이어야한다.

5로 나누고 그걸 입력하자!



(5로 나누기)




(등장한 값)



이 값을 5개 입력해주면 되겠다!



(실패)



... 여기서 정말 바보같은 일을 했다는 사실을 알았다.
무작정 5로 나누고 그 값을 5개 더해주니...
나머지는 생각을 안했던 것이다.

내가 입력한 값을 다섯번 더해주니 값이.



(내가 입력한 총합)


21DD09E8이 나왔다. 4가 부족했다.. ㅎㅎㅎ

앞에 4개를 1씩 증가시키고 뒤에 그대로 하나 붙여주는 식으로 맞추어주었다.



(문제 해결)


문제 해결!

'WarGame > 500 Project' 카테고리의 다른 글

(46/500) - pwnable.kr - flag  (0) 2017.07.05
(45/500) - pwnable.kr - bof  (0) 2017.07.05
(43/500) - pwnable.kr - fd  (0) 2017.07.05
(42/500) - Lena's Tutorial 01  (0) 2017.07.05
(41/500) Wargame.kr - Crypto Crackme Basic  (0) 2017.06.28


리버싱 문제를 풀다 너무 재밌어보이는 사이트를 발견하여 또 시작하게된 사이트...

pwnable.kr 이다.! 뭔가 내용도 스토리가 있어보인다.
아주 초보단계부터! 해보기!

사이트 화면


(사이트화면)



제일 앞에 문제 fd 문제부터 풀어보겠다.



(fd 문제)


Linux의 파일 디스크립터를 알아야한다는 그런 내용인거 같다.

일단 처음이니 접속을 해보자!



(접속!)


오호~ 첫화면~~

fd로 로그인하여 확인해본다.



(파일들)


먼저 소스코드를 확인해본다.



(소스코드)


소스코드를 확인해보니
어떤 조건들을 만족시켜서 fd_pwn 권한으로 flag 파일을 읽어주게 하는게 목표인것 같다.

처음에는 파일을 만들고 거기에 LETMEWIN\n 을 입력하여 이 파일 디스크립터를 입력해주어야겠다라고 생각하고 시작하다가 표준입력이 문득 생각이 들었다.

LETMEWIN\n을 표준입력으로 주고 fd를 0으로 만들면 되지 않을까?



(공격!)


여기서 한번의 실패를 겪었다.

하지만 strcmp는 마지막에 Null을 비교한다는 사실이 퍼뜩생각이나 혹시나 하는 마음으로 마지막에 널을 넣어주고 공격해보았다.



(공격)


성공! 
첫문제는 조금 간단하지만 신선했다.! (이전에 풀던문제들과 달랐다.)

'WarGame > 500 Project' 카테고리의 다른 글

(45/500) - pwnable.kr - bof  (0) 2017.07.05
(44/500) - pwnable.kr - collision  (0) 2017.07.05
(42/500) - Lena's Tutorial 01  (0) 2017.07.05
(41/500) Wargame.kr - Crypto Crackme Basic  (0) 2017.06.28
(40/500) Wargame.kr - EASY_CrackMe  (0) 2017.06.27


레나의 튜토리얼! 문제를 꼼꼼히 풀어보겠다.!

기타 다른 리버싱문제를 풀고있었지만, 뭔가 조금 부족한 느낌이 들어서 Lena's Tutorial을 먼저 완파하면서 공부를 더해야겠다는 생각이 들었다.

Lena 151 의 첫번째 문제이다. :)



(첫번째 문제)


실행을 하면 아래와 같이 뭔가 문구가 뜬다.




(실행 화면)



새로운 라이센스를 사라고 한다.
여기서 OK 버튼을 누르면 프로그램이 종료된다...

올리디버거를 이용해 프로그램을 확인해 보겠다.



(올리디버거 실행)


시작하자마자 main 함수에서 딱 멈추어 주었다.

실행 코드 중 눈에 띄는 API가 있었다.



(CreateFileA)



기본적으로 CreateFileA API는 파일을 생성하는 함수이다.
그런데 Mode를 보니 OPEN_EXISTING 이 설정되어있다.
이 것이 설정되어있으면 기존에 파일을 찾아서 열고 만약 이 파일이 없다면 에러를 리턴한다.

아.! 일단 여기서 걸렸구나. 계속 한번 진행해본다.


(잘못된 길)



호출 후 EAX를 -1 과 비교한다. 이 때 파일이 없으면 EAX가 FFFFFFFF 로 리턴되는 것을 확인했다.
즉 이 값은 -1이기에 점프하지 않고 바로 문제의 길로 들어선 것이다.

먼저 Keyfiled.dat 파일을 만들자!



(파이썬 이용)



파이썬을 이용해 Keyfile.dat 파일을 생성해주었다.
내용은 그냥 아무값 90을 넣어주었다. 100개정도 (이따 확인하기 위하여)

(같은 경로)



프로그램과 같은 경로로 옮겨준다.

자 이제 다시 실행해본다.



(올바른 점프)



문제의 길로 들어서지 않고 올바른 길로 점프하였다.

그다음은?
ReadFile이 보인다. 해당 파일을 읽어서 뭐 하려나보다.!

확인해본다!



(비교중)



확인해보니 반복하면서 확인하고 있었다.
AL이 Null 이면 종료를 하고 47이면 esi를 하나 올리고 그렇지 않은 경우 ebx를 하나씩 늘리면서 반복한다.

그런데 비교하는 AL은  바로...!



(우리의 파일)



우리가 90을 입력했던 데이터이다.

일단 이 내용과 비교하는 것을 확인했다.
그리고 0x47과 비교하는 문장



(0x47비교)



데이터 한바이트씩 읽어서 비교를 하는데 0x47이면 esi를 하나씩 증가시킨다. 그래서 맨 마지막에 8과 비교해서 크면 올바른 길로 들어선다.

즉! 0x47을 8개 이상! 넣어줘본다.



(넉넉히 9개)



9개를 넣어주었다.

그리고 다시 실행해주니



(축하메세지)



축하메세지를 전달해주는 모습을 볼 수 있었다.

문제 해결!


(문제 해결)

'WarGame > 500 Project' 카테고리의 다른 글

(44/500) - pwnable.kr - collision  (0) 2017.07.05
(43/500) - pwnable.kr - fd  (0) 2017.07.05
(41/500) Wargame.kr - Crypto Crackme Basic  (0) 2017.06.28
(40/500) Wargame.kr - EASY_CrackMe  (0) 2017.06.27
(39/500) Suninatas - Binary(11)  (0) 2017.06.27


Wargame.kr 사이트에서 Crackme 기초 문제이다!

사실 쉬운문제인데 너무 돌아간 느낌이 있다...

간단한 리버싱 문제라길래 냉큼 받아 풀었다.



(문제 화면)



프로그램을 실행하면 다음과 같이 이름과 패스워드를 물어본다.



(프로그램 실행 화면)



프로그램은 C# 으로 개발되어있다. (그래서 이 문제를 냉큼 받아서 했다.!)
(왜냐하면 나에게는 dotpeek 이 있기 때문에!!!!)
(바로 디컴파일 하니 보기 좋은 소스코드가 나왔다.)

메인 함수부터 보자!



(메인함수)


이름은 BluSH4G 로 입력해야하고...
그다음 입력이 조금 처리가 되있다. s1에는 입력받은 문자와 이름을 myEncrypt 함수에 넣어 처리를 하고 그 값과 getps 함수의 결과값과 비교한다. 

getps 함수는 어떤 url에 name 값을 전달하면 특정 문자열이 온다.
그 값은 sNfpY/vo6zye3TKPpH6Ekmtx26qLLriF/RpV4Fsyho/YkA2kvF9ybHLWjgGoV5EE 였다.!

문제는 암호화 함수 부분!


(암호화 함수 부분)



뭘하는지는 냉큼 이해 되었다.
암호모드 ECB모드로 초기벡터와 키는 name에 어떤 처리를 한 값을 주어 DES로 암호화 한다.

그러면 어떤 처리를?..


(mPadding 함수)


이 함수에서 이름을 처리해서 그 값을 초기벡터와 키값으로 사용한다.

즉 우리는 이 값을 알아야한다. 이름을 BluSH4G 로 입력하라고 했고 길이는 7이므로 하나의 * 문자가 붙을것이다. 결과값은 BluSH4G* 이 될것이다.

그렇다면 

BluSH4G*을 초기벡터, 키 값으로 사용하여 전달받은 문자열을 DES 복호화 하면된다.



(복호화 과정)


여기서 조금 엉뚱땅 팠는데..
암호화 함수에서 마지막에 Base64 인코딩을보고 나혼자 C# 컴파일러 만지면서 디코딩과정부터 만지고 있었다. 생각해보면 DES 암호화 후 Base64로 표현하여 출력하는게 일반적이어서 일반적인 사이트에서 기본적으로 제공해주고 있었다.

나는 고로 파란 버튼을 클릭하기만 하면 됬었다.


(문제 해결)

'WarGame > 500 Project' 카테고리의 다른 글

(43/500) - pwnable.kr - fd  (0) 2017.07.05
(42/500) - Lena's Tutorial 01  (0) 2017.07.05
(40/500) Wargame.kr - EASY_CrackMe  (0) 2017.06.27
(39/500) Suninatas - Binary(11)  (0) 2017.06.27
(38/500) Suninatas - Binary(10)  (0) 2017.06.27


오..! 그동안 손 못대던 리버싱 문제를 하나씩 손대고 있다! (기분이 좋다)

이번에는 Wargame.kr 의 리버싱 문제를 풀었다.
여기도 웹문제만 많이 풀었던 사이트였는데! ㅎㅎ

EASY_CrackMe 문제다!



(문제)



문제 프로그램을 받으면 키를 입력하라고 나온다.




(프로그램 실행)



역시! 여기에 알맞은 키를 찾는 것이다.

이 문제는 좀 오래걸렸다... 그것도 마지막에 운이 좋아서?...

일단 코드를 큰그림으로 보면 처음에 BL에 1을 넣어준다.



(BL에 1 대입)



자.. 이제부터 이 EBX 레지스터의 1을 지키는 험난한 과정이 시작된다.

처음에는 너무 이해가 안가서 코드 한줄한줄 분석하면서 흐름을 손으로 직접 그려보았다.



(흐름도)



이렇게 흐름도를 손으로 그려보니 내가 어떤 일을 해야하는 지 이해가 간다.
EBX 레지스터를 보호하는 여정이라는 사실도 그려보고 이해했다.

그런데 중간에 이해가 안가는 함수가 있었다... 

005024A9 함수인데... 바로 이녀석을 따라들어가면 또 거기서 함수를 호출하고
또 그안에서 함수를 호출한다.
분석이 너무 안되던 참에..

그 동안 알아낸 사실들을 정리해보았다.

입력값이 13글자 이상이여야한다. 
_my_b , birth 요 문자들이 들어가야한다.

그러고 보니 _my_birth  앞에 4글자 생일을 넣으면 14자리인거다...
혹시나 해서 생일을 어떤 연산을 하나 내 생을 집어넣고 돌려보았다. 




(내 생일)



005024A9 함수가 호출된 후 리턴된 EAX값을 보니 3FA....
내가 내 생일 16진수로 표현한 3FA를 아이디로 많이 사용해서 단번에 알아보았다...
16진수 표현이구나!



(16진수 표현)



그렇다면 리턴값 eax가 45A 여야한다는 뜻은
45A -> 1114(10) 으로 집어넣어야한다는 뜻...



(45A 비교)



즉 이 문제를 만든 사람 생일이 11월 14일인가보다..

이렇게 문자열을 조합하고 프로그램에 입력해보니!




(잘했다!)



잘했다고 인증키를 알려주었다.




(문제 해결!)


'WarGame > 500 Project' 카테고리의 다른 글

(42/500) - Lena's Tutorial 01  (0) 2017.07.05
(41/500) Wargame.kr - Crypto Crackme Basic  (0) 2017.06.28
(39/500) Suninatas - Binary(11)  (0) 2017.06.27
(38/500) Suninatas - Binary(10)  (0) 2017.06.27
(37/500) Suninatas - Binary(9)  (0) 2017.06.27


* 서니나타스의 바이너리문제 11번이다!

프로그램을 실행하면 아래와 같다.




(프로그램 실행)



올리디버거를 이용하여 문제를 해결하였다.
참조된 문자열을 먼저 확인하였다.



(문자열)



내가 찾고싶은 인증키 문자열이 있는 쪽의 함수를 찾아야하므로 Authkey 문자열이 존재하는 위치로 달려가서 그 해당 함수에 BP를 설치한다.



(BP 설치)



그 후 달린다!




(입력)



입력은 알아보기 쉽게 D 여러개 입력!

그리고 아래로 쭈욱 가니 뭔가의 문자열들이 있고 이 문자열들 하나씩 함수에 들어간다.
같은 함수이다.


(뭔가 작업하는 부분)


일단은 큰그림을 보기위해 넘어간다.!
이러한 문자열들이 하나씩 함수에 들어가구나 정도만 파악하였다.

아래를 보니 내가 보고싶은 문자열 Congratulation 문자열 바로 전에 분기문이 존재하고 
그 분기문 위에 어떤 함수를 호출하고 있는게 보인다.



(분기문)



아마 이 함수에서 결정이 나는 듯 하다.
확인!


(비교 과정)


들어가보니 뭔가를 비교하고 있다.

EAX와 EDX를 비교하고 있는데 이 두 값을 확인해봐야겠다.



(레지스터 확인)



아하.! 내가 입력한 값과 어떤 문자열을 비교하고 있다.

위의 함수들을 확인해본 결과 해당 문자열들을 이리저리 배치한 문자열이었다.

이 문자열을 입력값으로 입력하여 실행하였더니?




(인증키 등장)



인증키가 등장하였다.

이 값을 인증값에 넣었더니 문제 해결!



(문제 해결!)



서니나타스의 10번 바이너리 문제이다!

프로그램을 실행시켜보면 아래 같이 실행된다.



(프로그램 실행)



뭔가 값을 입력하는데 이것 또 flag를 찾아서 입력하는 것 같다.






(프로그램 실행)



흐음.. 근데 풀면서 몰랐던 거인데
올리디버거로 실행이 안된다..



(올리디버거 실행)



게다가 attach 도 안된다..?!




(attach 실패)



이게 뭐람 
하고 키 문자열 찾는거니까 헥스에디터로 열어봤다.
암.복호화 같은 과정이 없다면 문자열이 그대로 있지 않을까 싶어서 확인해보았다.



(헥스에디터로 확인)



그런데?...



(뭔가 발견)



Authkey : ~~~ 라고 나와있다.
?... 이건 또 뭐람...

혹시나 하는 마음으로 입력해보았다.



(인증성공)



얼떨결에 뒷걸음 치다 풀었다. (???... 이상함이다.)

인증 문자열에 PEID를 쓸줄 아냐고 도발하길래
(사실 이때 몰랐다.)

검색을 하여 사용해봤다.



(PEID)



PEID로 문제 파일을 열어보았다.




(PEID로 열어봄)



음 그런그런 파일 내용이구만
그런데.. 다른 PE 뷰어랑 좀 다른 느낌이 들었다. 개발된 언어도 알려주고있다...

C# ?

C#은 뭐지? -> 인터넷검색... (모르는게 많다.. ㅜ)

C#이 뭔지 검색해서 읽고 있던 중 눈에 띄는 걸 발견했다.



(C#)



으흐음 .. 자바 같이 가상머신 위에서 돌아간다라는 말이다.
그래서 올리디버거에서 실행이 안되었던건가?..

나는 이 파일을 분석해보고 싶어 올리디버거로 C# .net 프로그램을 여는 방법을 검색해 보았다.
그런데 C# 프로그램은 올리디버거로 열수 없고... 다만 C#은 좋은 디컴파일러가 많기 때문에 구지 디버거로 분석할 이유가 없다는 글을 보았다.

추천 받은 디컴파일러는 dotpeek 이었다. 다운 받고 열어보니..
세상에 이런일이



(dotpeek)



누가봐도 읽을 수 있는 코드로 나왔다...
(신기하다...)

이렇게 문제를 해결하였다.


'WarGame > 500 Project' 카테고리의 다른 글

(40/500) Wargame.kr - EASY_CrackMe  (0) 2017.06.27
(39/500) Suninatas - Binary(11)  (0) 2017.06.27
(37/500) Suninatas - Binary(9)  (0) 2017.06.27
(36/500) Lord of the BOF - death_knight  (0) 2017.06.27
(35/500) Lord of the BOF - xavius  (0) 2017.06.25

+ Recent posts