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


최근 리버싱 공부를 시작했다. 
책 한권을 끝낸 기념으로 리버싱문제를 풀어볼 것이다.

이제 내가 풀이에 접근 가능한 영역이 리버싱이 추가됬다는 사실에 기쁘다!!! :)

써니나타스의 Web 문제만 풀었었는데 이제 Binary 문제도 풀어주마!

9번 문제를 풀 것이다!



(Binary 9번문제)


파일을 다운받으니 Project1 이라는 실행파일이 보인다.




(실행 파일)



올리디버거로 열어본다!





(올리 디버거 실행)



Main 함수에 찾아가는 방법이 여러가지 있겠지만 문자열을 이용해 찾아보겠다.



(사용된 문자열)


사용된 문자열들을 보니 Congratulation ??? 
느낌이 딱 왔다. 어찌저찌 조건을 만족하면 이 문장을 출력해주는구나.

실제 실행파일을 실행해보면 입력하는 란이 나오고 거기에 입력하여 프로그램을 실행시키는 방식이다.
어떤 특정 값(키)를 입력하면 이 문구가 나오는가보다.

냉큼 그 자리로 달려가 Main 함수 시작부분에 BP를 설치해준다.



(BP 설치)


그리고 여기까지 달려준다.

중간에 퍼즈 당하면서 창이 하나 뜨고 입력하라고 나온다. 입력하지 않으면 실행이 안되는데 아마 입력하고 클릭을 누르는 순간 내가 생각하기에 main 함수인 저 함수로 넘어오는 가 보다! 라고 생각했다.
여튼! 우리의 목적은 축하 메세지를 받는 것이므로 이 함수를 분석해야하는 것은 맞다! 메인함수든 뭐든!

입력 값은 D를 몇개 적어주었다. 헥스값으로 보면 0x44 이기 때문에 쉽게 눈에 띌거 같아서 D 몇개를 넣었다.



(D 입력)



이 함수의 맥락을 보니 분기문 전에 CALL을 하는데 여기서 분기문이 갈라지는 조건을 체크하는 듯 했다.



(분기문 전 CALL)



이 함수 안으로 들어가서 봐야겠다.



(분기문 전 CALL 함수)



보니보니 EAX 값을 ESI 에 넣고, EDX를 EDI 넣고 비교한다.

EAX와 EDX에는..!



(레지스터)



내가 입력한 D 여러개와 어떤 문자열이 들어있었다. 
아! 이 문자열과 비교를?



(문자열 입력)



적혀있는 문자열을 적어보았다.



(축하메세지)



???

축하메세지가...
이 키를 입력하면 인증에 성공한다.


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

(39/500) Suninatas - Binary(11)  (0) 2017.06.27
(38/500) Suninatas - Binary(10)  (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
(34/500) Lord of the BOF - nightmare  (0) 2017.06.23


BOF 원정대의 마지막 몬스터 death_knight를 잡아보자.!

* death_knight 소스


(death_knight.c)


소스코드를 보니 마지막 문제는 Remote BOF 문제였다.
원격에서 공격하는 방법인데
방법은 크게 두가지가 있다. 바인드쉘을 이용하거나, 리버스쉘을 이용하거나.

나의 계획은 바인드쉘을 이용할 것이었다.
일단 netstat 명령어로 소스코드대로 6666 포트가 열려있는지 확인해본다.


(열린 포트 확인)


파일 권한을 확인해보니 역시 setuid가 설정되어있고 eath_knight가 주인이다.



(setuid)



바인드 쉘을 구해서 테스트해보았다.
1337 포트를 오픈하는 코드이다.



(바인드쉘 테스트)



실행!


(1337 오픈!)



하지만 이 방법에 문제가 있었다.
(아직 이 문제에 대한 의문은 해결되지 않았다...)
(바로 bof 공격 코드까지 파이썬으로 만든후 공격을 성공시켜서 1337 포트가 열리는 것까지 확인했다.



(포트 오픈)



그런데 이상한점이 있었다.
여기서 '아! 이제 열렸으니 접속을 해볼까?' 하고 접속을 시도하면 짤린다...

와이어샤크로 분석해보니 ack 요청을 보내자마자 서버에서 fin 을 날려 종료시킨다...
이유는 모르겠다. 방화벽때문인가??...
계속 이것저것 시도했지만 여전히 접속이 안되었다...

그리하여 방법을 바꾸어 리버스 쉘을 이용하기로 했다.
내가 포트를 오픈하고 서버에서 나에게 접속을 시도하게 하는 것이다.
만약 이때 짤리면 내 방화벽을 내리면 되기때문에 이 방법으로 전환했다.

shell 코드는 인터넷에서 구했다. 내 호스트 IP 주소와 5555 포트번호로 접속을 시도하는 리버스 쉘코드이다.
이 코드를 이용하여 익스플로잇을 만든 후 실행했다.



(exploit 코드)




(공격 모습)



이 때 나는 nc를 이용하여 5555 포트를 열고 기다리고 있었는데 연결이 성립되면서 쉘을 획득 할 수 있었다.



(공격 성공)



쉘 획득!

이로서.....!

BOF 원정대의 모든 문제를 클리어할 수 있었다.



(all clear!)


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

(38/500) Suninatas - Binary(10)  (0) 2017.06.27
(37/500) Suninatas - Binary(9)  (0) 2017.06.27
(35/500) Lord of the BOF - xavius  (0) 2017.06.25
(34/500) Lord of the BOF - nightmare  (0) 2017.06.23
(33/500) Lord of the BOF - succubus  (0) 2017.06.23


BOF 원정대의 Xavius를 잡아보자!

* Xavius 코드


(xavius.c)



xavius의 특징
1. ret 주소에 라이브러리 함수를 사용하지 못한다.
2. 0x08, 0xbf 로 시작하는 주소 또한 ret 주소에 넣을 수 없다.
3. 단.! fgets를 사용한다.

fgets 함수의 특징을 알고 있어 이 문제를 쉽게 풀 수 있었다.
바로 fgets 함수는 입력 버퍼가 있어 그 곳에 입력을 저장한 후 실제 스택 버퍼에 옮긴다.
우리의 입력이 어딘가에 또 저장이 되어있다는 말이다.

사실을 확인해보기위해 strace를 통해 실제 시스템콜과 사용되는 메모리 주소를 확인해보자.



(read 시스템콜)



아래 write() 시스템 콜이 보인다. 그리고 그 바로 위에 어딘가에서 read 해오고 있는 모습을 볼 수 있다.
바로 이곳이 우리가 생각했던 임시 버퍼라는 것을 예상해 볼 수 있다.

그렇다면 진위를 파악하기 위해 gdb를 통해 실제 메모리를 확인해보자!


(임시 버퍼)


우리의 예상대로 0x40015000 주소가 바로 fgets의 임시버퍼였다.

우리는 바로 이곳에 쉘코드를 올리고 이곳으로 eip를 떨굴것이다.
그렇다면 ret 주소에 이 주소를 넣어야한다. ret 주소에 이 주소가 들어갈 수 있는지 확인!


(ret 주소)


ret 주소에 해당 주소를 입력해도 괜찮았다.

이제 이 주소에 Nop코드와 쉘코드를 올려주고 ret 주소에 해당 영역의 주소를 넣어준다.

공격!


(공격!)



(공격 성공)


쉘을 획득 할 수 있었다. :)

+ Recent posts