안녕하세요. 누락된 마지막 문제 basic rce level 6을 풀어보겠습니다.

홈페이지로 들어가 파일을 받아주세요. 언팩을 한 후 OEP와 Serial을 알아내는 문제이군요. peid로 파일을 분석해봅시다.

UPX이군요. 언패킹합시다.

파일을 열어봅시다.

음.. 올리디버거로 얼어봅시다.

성공적으로 언팩이 되었군요. 문자열을 찾아봅시다.

문자열이 없습니다.. 그럴리가 없는데 말이지요.. 우리는 Wrong이라는 메세지박스를 똑똑히 봤습니다. 언팩한 파일을 한 번 살펴봅시다.

하필 그 많은 언어중에 디버깅이 힘들다는 C++로 만들어졌습니다. 문자열을 찾지 못한다면 함수로 찾아봅시다. 올리디버그로 돌아가서 오른쪽마우스 - Search for - All intermodular calls를 눌러주세요.

Destination을 눌러 함수를 정렬시켜주고 우리가 본 메세지박스를 출력시키는 함수를 찾아봅시다.

찾았으면 진입합시다.

호오 우리가 원하던 곳으로 왔습니다. 조건문을 한번 볼까요. TEST EAX,EAX라고 되어있군요. TEST는 AND연산이죠. 한번 브레이크를 걸고 실행해보겠습니다.

시리얼값에 123을 넣고 실행시켜 TEST코드까지 왔을때의 EAX값은 1이군요.

여기서 TEST를 자세히 알아보겠습니다. TEST EAX,EAX는 EAX와 EAX를 and연산하여 0이 아닌 값이 나오면 ZF를 0으로 설정합니다. 반대로 연산값이 0이 나오면 ZF를 1로 설정하지요. 즉 EAX가 1이기 때문에 and연산을 하면 1이 나오고 ZF는 0으로 바뀝니다. 즉 ZF를 1로 만들기 위해서는 우리는 EAX를 0으로 만들어줘야 합니다. EAX는 보통 함수의 반환값 저장에 쓰입니다. 그러므로 근처코드에 함수를 호출하는 주소가 아마 있을 것입니다. 찾아봅시다.

찾을 것도 없이 위에 있네요. 진입해봅시다.

대략 소스를 해석해보자면

1. EDX와 ECX에 어떤 값을 집어 넣는다.

2. 4012A0(빨간 상자땜에 코드가 짤렸네요.)에서 EDX의 1byte를 EAX에 넣는다.

3. 그 EAX(AL)과 ECX를 비교한다.

4. ZF가 0이면 주소로 점프하여 EAX를 1로 만들고 리턴시킨다.

5. ZF가 1이면 EAX의 다음값과 ECX의 다음값을 비교한다.

6. 조건을 충족하지 않았을 경우 반복한다.

대충 이런 식입니다. 그렇다면 일단 EDX와 ECX에 어떤 값이 들어왔는지 확인해 봅시다.

ECX는 우리가 입력한 시리얼값이고 EDX는 어떤 문자열이군요. 정리하면

우리가 입력한 시리얼 값을 1byte씩 떼와서 EDX랑 비교하고 만약 값이 다를 경우  (ZF = 0) EAX를 1로 만들고 리턴시켜 실패 메세지박스가 출력되도록 한다. 대충 이렇게 정리할 수 있겠군요. 그러면 뭐 간단하죠.

시리얼 값을 AD46DFS547로 주면 끝입니다. 한번 해봅시다.

 

성공메세지박스가 출력되었습니다. 시리얼 값은 AD46DFS547입니다.

여기서 끝이면 좋겠지만 우리는 OEP를 찾아야 합니다. OEP란 프로그램이 처음 시작되는 주소입니다. 단 패킹된 파일은 패킹을 풀고 난 후의 시작주소가 OEP입니다.

OEP야 뭐 간단합니다. 우리는 파일은 언패킹했으니 그 언패킹된 파일의 시작주소를 보면 됩니다.

OEP = 00401360입니다. 즉 정답은 00401360AD46DFS547입니다.

네 이것으로 문제풀이를 마치겠습니다.

 

'codeengn' 카테고리의 다른 글

codeengn - Advance RCE level 2  (0) 2016.08.03
codeengn - Advance RCE level 1  (0) 2016.08.03
codeengn - basic rce level 5  (0) 2016.08.02
codeengn - basic rce level 20  (0) 2015.10.02
codeengn - basic rce level 19  (0) 2015.10.02
Posted by englishmath
,

안녕하세요. 이번엔 누락된 부분 인 basic rce level 5를 풀어보겠습니다. 홈페이지로 들어가 파일을 받아서 실행해봅시다.

등록키를 알아내는 문제입니다. 올리디버그로 열어봅시다.

PUSHAD로 적혀있는것을 보아 UPX패킹되어있을 확률이 높습니다. EXEINFO PE로 확인해봅시다.

UPX로 패킹되어있군요. UPX패커로 풀어줍시다.

풀었으면 파일을 올리디버그로 열어봅시다. 그리고 아까 보인 실패문구열(WRONG...)을 찾기 위해 오른쪽마우스 - Search for - All referenced text strings를 누릅시다.

문구열을 찾아봅시다.

찾았습니다. 들어가봅시다.

코드를 실행해보니 저기 JMZ가 분기점인 모양입니다. ZF가 0이면 점프를 하여 실패문구열로 가버리는 놈입니다. 그런데 ZF를 결정하는 비교문이 없습니다. 아무래도 바로 위 코드에서 호출하는 부분에 있는 모양입니다. 브레이크를 걸고 실행해봅시다. 등록키값은 그냥 12345로 줍시다.

브레이크에 걸리면 F7키를 이용해 따라가 봅시다.

EAX와 EDX를 비교해서 같으면 JE를 이용해 점프를 합니다. 점프를 하게 되면 바로 RETN부분으로 가며 ZF도 1인 상태로 가게 됩니다. EAX와 EDX의 값을 확인해봅시다.

EAX는 Unregistered...이고 EDX는 Registered User이군요. Unregistered...는 우리가 창에서 본 첫번째 입력칸에 적혀 있는 문구입니다. 그렇다면 이 부분을 Registered User로 고치고 실행해봅시다.

값을 바꾸고 실행해봅시다.

ZF가 1이 반환되어 JNZ에서 점프를 하지 않는 것을 하지 않는 것을 알 수 있습니다. 계속 한줄씩 실행해봅시다.

더 말이 필요하겠습니까? 403B2C로 들어갑시다.

마찬가지로 EAX,EDX를 비교합니다.

12345는 입력한 값, 비교하는 값은 GFX-754-IER-954이군요. 해봅시다.

성공이군요. 등록키를 입력해봅시다.

네 이것으로 문제해결을 마치겠습니다.

 

'codeengn' 카테고리의 다른 글

codeengn - Advance RCE level 1  (0) 2016.08.03
codeengn - basic rce level 6  (0) 2016.08.02
codeengn - basic rce level 20  (0) 2015.10.02
codeengn - basic rce level 19  (0) 2015.10.02
codeengn - basic rce level 16  (0) 2015.10.02
Posted by englishmath
,

1. 목표를 찾읍시다.

목표를 가지고 일을 하는 사람과 목표 없이 일을 하는 사람은 확실히 다릅니다. 여러분들은 무엇을 위해 리버싱을 하십니까?

저같은 경우는 집에 게임이 하나 있는데 그 게임을 한번 분석해보고 싶어서 리버싱을 시작했습니다. 음... 너무 초라한가요? 하지만 목표라는 것은 사람에 따라 초라하게 보일 수도 있고 거창하게 보일 수도 있습니다. 여러분들이 보기에 저의 목표는 초라하게 보이겠지만 저는 이 목표가 거창하다고 생각합니다.

아무튼 목표라는 것은 어떤 일을 계속 할 수 있도록 도와주는 원동력이자 끈기를 갖게 해주는 힘입니다. 여러분들이 지금 리버싱이 너무 힘들다고 생각되시면 잠시 하던 것을 멈추고 천천히 목표를 한번 찾아보십시요. 분명 지금보다는 나아질 것입니다. 

2. 구글링을 습관화 합시다.

흔히 사람들이 공부를 하다 막히면 구글링을 해보라고 합니다. 그만큼 구글은 다른 검색엔진과는 비교가 안되는 검색엔진으로 자료를 찾아주기 때문에 구글엔 없는게 없다. 라는 말까지 생겨났습니다. 그만큼 구글엔 리버싱을 도와주는 프로그램과 사이트가 널려있으며 명령어 종류와 뜻, 문제 풀이 등의 자료가 널려있으므로 공부를 하다가 막히는 것이 있으면 구글링을 해보십시요. 열에 여덟,아홉은 찾을 수 있을 것입니다.

3. 도구를 많이 가지고 다닙시다.

리버싱을 하기 위해선 도구가 정말로 중요합니다. 도구를 얼마나 가지고 있느냐에 따라 프로그램이 분석되냐 안되냐로 갈립니다. 그럼 리버싱 도구는 어떤 것들이 있을까요?

- 올리디버그(파일 실행 흐름 분석)

- PEID(파일 패킹유무 분석)

- UPX패커(UPX로 파일을 패킹 또는 언패킹)

- PEview(파일구조분석)

- winhex(파일을 헥스형태로 분석)

- VMUnpacker(파일 언패킹)

- ILSPY(C# 디어셈블러)

등이 있습니다. 물론 도구는 셀 수도 없이 많으므로 하나씩 도구를 모아 리버싱에 도전해봅시다. 도구 모으는 재미도 쏠쏠히 느낄 수 있습니다.

여기까지 읽어주셔서 감사합니다.

'소소한 이야기들 > 리버싱' 카테고리의 다른 글

리버서의 마음가짐  (0) 2016.07.30
Posted by englishmath
,