'Wargame/CodeEngn'에 해당되는 글 30건


code engn basic 10번 문제다.

파일부터 실행해보자.

입력이 막혀있다. About 버튼만 눌리는데 아직까진 뭔지 모르겠다.

파일 형태를 확인해보니 AsPack라는 방식으로 패킹되어 있는 것 같다.

그렇다면 AsPack의 언팩 방법을 알아야 한다. AsPack 같은 경우 RETN 0c를 찾은 후 그 밑에 있는 RETN에 BP를 걸고 실행해주면 OEP를 찾을 수 있다.

이 후 부터는 UTX와 같은 방법으로 언팩해주면 된다.


딱 봐도 의심스러운 REgi~문자를 더블클릭해서 들어가보자.

분기점을 찾으라고 했으니 딱봐도 제일 근처에 있는 JNZ가 분기점이 될 것 같다. 그렇다면 OEP와 분기

점 OPCODE모드 구하였다. 정답은 다들 짐작하실거라 믿는다.

basic은 말그대로 그냥 어려운 리버싱에 흥미가지라는 수준의 문제들인 것 같다. 빨리 다 풀고

wargame.kr 리버싱 문제들 해결하고 advanced로 넘어가야 될 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 12번  (0) 2018.02.04
code engn basic 11번  (0) 2018.01.28
code engn basic 9번  (0) 2018.01.28
code engn basic 8번  (0) 2018.01.28
code engn basic 7번  (0) 2018.01.28
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 9번 문제다.

StolenByte를 구하면 될 것 같다.

파일부터 실행해보자. 흠..키 파일?


일단 파일부터 확인하고 열어보자. UPX로 패킹되어 있어 언팩 후 파일을 열었다.

실행부터 해보니 첫 번째 MEssageBoxA에서 다음처럼 이상한 화면이 나온다.

처음에 언팩이 잘못됬나하고 여러번 해봤는데 계속 같은 화면이 나온다. 그렇다면 첫 번째 messagebox에서 뭔가 문제가 있다는건데 자세히보니 스택부분에 다음과 같이 4개의 인자가 들어간다.


그렇다면 3개의 인자가 부족하다는 거고  OEP 위의 12바이트가 NOP로 존재하고 있다. 그렇다면 이부

분에 Stolen Bytes를 찾아 넣으면 될 것 같다. 패킹된 파일로 가서 한번 찾아보았다.


확인해보니 위에서 PUSH를 3번 해주는 부분이 있다. 메모리 주소가 아닌 바이트를 구하랬으니 이제 충

분히 사이트에서 원하는 답은 찾을 수 있을 것이다.

그럼 이제 추가로 완벽하게 언팩을 한번 해 보자.

NOP에 PUSH 3번해주는 코드를 넣어주고 OEP를 100C에서 1000로 바꾼다.

이대로 실행해주면 정상적으로 출력값이 나온다.!

성공! 


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 11번  (0) 2018.01.28
code engn basic 10번  (0) 2018.01.28
code engn basic 8번  (0) 2018.01.28
code engn basic 7번  (0) 2018.01.28
code engn basic 6번  (0) 2018.01.28
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 8번 문제다.

OEP를 찾으면 되는것 같다.

파일 형태부터 확인해보니 UPX 방식으로 패킹되어있다. 언팩하는과정은 이전에 다뤘으니 생략하겠다.

언팩된 파일을 열어보자.

? 그대로 입력해주면 된다. 갑자기 왜 이런문제가 나왔지. 그냥 쉬어가는 문제인 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 10번  (0) 2018.01.28
code engn basic 9번  (0) 2018.01.28
code engn basic 7번  (0) 2018.01.28
code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 7번 문제다.

 파일부터 실행해보았다.

흠.. 키값을 구해야돼나? 일단 파일부터 열어보자.

흠.. 처음보는 함수가 많다. 일단 IstrcatA, IstrcmpIA 함수 같은 경우는 익숙한 함수라 아무 생각없이

이거 위주로 분석해봤더니 키 값은 너무 쉽게 구할 수 가 있다. 뭐지?했는데 문제자체가 이걸 요구하는게

아니었던게 생각났다. 기억력이 금붕언가..? 그래서 함수를 좀 찾아보기로 했다.


흠.. 드라이브 이름과 관련있는 함수가 딱보니 GetVolumeInformationA 일 것 같다. 찾아보니 현재 파일이 위치한 드라이브 이름을 VolumenameBuffer(0040225C)에 반환해 준단다. 그 후 따라가보니 IstrcatA에서 위의 0040225C를 첫번째 변수로 넣어준다. IstrcatA에서 참조하는거보니 공백이다.  CetVolumInformationA 함수에서 RootPathName에 Null값을 넣어주면 C:가 반환된다 했는데 내 환경에서는 그냥 공백값이 반환되었다.

저 함수가 실행되고 나면  공백에 4562-ABEX가 추가되 0040225C에 4562-ABEX가 저장된다.  

그 후 보면 DL에 2값을 넣고 45225C,45225D,45225E,45225F에 1씩 추가를 한다. 이 때 45225C에 4562-ABEX가 저장되어 있으니 순서대로 4 , 5 , 6 , 2 값에 1씩 추가가 될 것이다. 저걸 DL이 1씩 감소하면서 점프문을 만나 반복되 총 2번 적용되게 된다. 그렇다면 6 7 8 4 이 값이 되게 된다. 실제로도 값이 변경되 적용이 되어있다.

이게 문제에서 원하는 정답인 것 같다.  코드엔진에서는 C드라이브 이름을 CodeEngn 이라고 했으니 그럼 C , o , d , e 에 아스키 코드값 2씩 올리면 끝!


아휴..웹쪽 문제만 주구장창 풀다보니 포스팅이 밀린게 너무많아서 할 엄두가 안난다... 괜히 엄한 리버싱만 포스팅.. 귀찮아도 슬슬 해야될 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 9번  (0) 2018.01.28
code engn basic 8번  (0) 2018.01.28
code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 4번  (0) 2018.01.28
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 6번 문제다. 

밀린 포스팅이 너무 많은데 블로그 쓰기는 왜이렇게 귀찮은걸까...하.. 그래도 힘내서 시작해보자. 

흠.. 이전에 했던 언팩에 조금 더 추가된 느낌이다. 


일단 프로그램부터 실행해보자.

흠 키를 찾아야 할 것 같다. 패킹되어있는지 확인 해보니 UPX 방식이다. 이전문제에서 언패킹 방법은 설명했으니 생략하겠다. 언패킹 후 올리디버거로 실행해보자. 

실행 후 문자열을 찾으면 딱봐도 감이 오실 거라 생각한다.  OEP랑 키 값을 더해서 입력해주면 끝.

흠.. 풀다보니 너무 쉬워서 왜이렇게 같은 문제만 내나.. 하고 찾아봤더니 이 문제에서는 다른 기술을 요

구하고 있는 것 같다. 언팩하지 않은경우 문자열로 찾을 수가 없는데 이 때 프로그램의 이벤트를 인식하

고 그 이벤트를 사용하는 코드로 이동하는 back to user mode를 사용할 수 있는 것 같다. 이 때 주의할

점은 프로그램이 멈춰있는 상태에서 이 모드를 써야한다는 것이다.

위와 같이 프로그램 실행 후 저 상태가 되면 확인버튼을 누르기전까진 프로그램이 멈춰있는 상태가 된다. 그럼이때 프로그램을 정지시켜 보자.

그러면 오른쪽 하단이 running에서 pause로 바뀌고 Alt+F9를 눌러주면 back to user mode 상태가 된다.

이 때 확인 버튼을 다시 눌러주면 이 이벤트를 사용한 코드로 넘어가게 된다. 이 때 키 비교와 관련된 코

드가 근처에 있을 것 같다. 위로 조금 올려보니 다음과 같이 원하는 코드를 찾을 수 있다.

처음엔 이 방식이 계속 안되서 뭔가하다가 찾아보니 64bit에서는 잘 동작이 안하는 것 같다. 그래서

32bit 설치해서 해보니 잘된다.. 하... 아까운 내시간.. basic이라 그런지 쉬운 개념들뿐이다 advanced

가면 좀 재밋어지려나..?


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 8번  (0) 2018.01.28
code engn basic 7번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 4번  (0) 2018.01.28
code engn basic 3번  (0) 2018.01.28
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn 5번 문제다.

등록키를 구해야 할 것 같다. 파일을 다운로드 받도록 하자.

실행해보니 다음과 같이 키 입력란이 나온다. 등록해보니 실패한다. 올리 디버거로 키를 구해야 될 것 같다.


간단할 것 같다. 에러 시 나타나는 문자열을 찾아 주변에서 키 입력하는 부분을 찾아보면 쉽게 해결 될 것 같다......라고 생각했으나 뭐가 없다... 아무리 찾아도 없다.. 뭐지..?

뭔가하니 이 파일이 패킹되어 있는 파일이란다.

그렇다면 언패킹을 하고 다시 실행하여야 될 것 같다. 찾아보니 이를 위해서는 2가지 프로그램이 필요하다.

먼저 어떤방식으로 패킹되어있는지 확인하기 위해 PEID라는 프로그램을 다운받았다. 실행해보니 

UPX1이라는 방식으로 패킹되어 있다고 나온다.

그렇다면 UPX1을 언패킹 해주는 프로그램을 다운받으면 될 것 같다.

 http://upx.sourceforge.net 

에 들어가서 다운을 받았다.

upx 파일같은 경우 cmd창에서 사용해야 한다. -d 옵션으로 언패킹을 하고 -k 옵션을 통해 백업 파일을 만들어 추후에 비교도 할 수 있도록 했다.

언패킹 후 PEID를 통해 다시 실행해보니 CODE 타입으로 변경된 걸 확인할 수 있었다.

이를 다시 올리디버거로 열고 문자열만 모아 보자. 


다음과 같이 에러 문자열 근처에 키값으로 보이는 값이 있다 더블클릭해서 자세히 들어가 보자.

문자열을 넣은 후 실행되는 CALL 함수에 의해 점프가 결정되는 것 같다. 

BP를 걸고 함수 안으로 자세히 들어가 확인해보니 입력한 User값이 Registered User와 일치하고 키 값

도 같은방식으로 일치하면 성공하는 방식인 것 같다. 그대로 입력해주니 성공!


위의 방식에서는 프로그램을 이용해 UPX를 언팩했다. 이번에는 프로그램 대신 직접 언패킹 해보도록 하

겠다. 

먼저 코드의 마지막 부분에 Jump문을 보면 상당히 많이 위로 올라가는 걸 볼 수 있다. 그렇다면 여기에

BP를 걸고 F9 후 F8로 하나 더 실행해보면 OEP(original Entry Point)로 갈 수 있다. 그렇다면 이 진짜

코드를 저장해야하는데 OllyDump라는 플러그인을 통하면 가능하다. 이 때 주의해야할 점이 Rebuild Import라는 버튼을 해제해주어야한다. 저 버튼을 클릭하고 하면 리빌드시 실패할 확률이 높기때문에 차라리 해제하고 다른 프로그램을 통해 해주는게 좋다.


LordPE라는 프로그램을 통해 리빌드를 해보자.

다음과 같이 원본코드가 나오고 언패킹이 성공하게 된다.

웹쪽하면서 틈틈히 해보고있는데 Basic쪽은 가볍게 풀 수 있는 정도의 문제들인 것 같다. 리버싱 막연히

어렵다고만 생각했는데 재미있게 풀 수 있을 것 같다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 7번  (0) 2018.01.28
code engn basic 6번  (0) 2018.01.28
code engn basic 4번  (0) 2018.01.28
code engn basic 3번  (0) 2018.01.28
code engn basic 2번  (0) 2018.01.27
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 4번 문제다.

디버거 탐지 함수를 찾아야 하는 것 같다. 파일부터 다운받아보자.

다운받아 실행해보니 정상이라는 표시가 뜬다.

올리디버거로 실행해보니 디버거를 탐지하는지 디버깅 당함이라는 메시지가 나온다.

그렇다면 이를 우회하는 함수를 찾고 실제로 우회를 할 수 있도록 코드를 바꿔버리면 될 것 같다.

오른쪽 클릭- Search for- All intermodular calls에서 함수이름들을 검색해보자.

리버싱에서는 함수이름들에 대한 감각이 중요한 것 같다. 대충 봐도 IsDebuggerPreSent란 함수가 상당

히 의심 스럽다. 더블클릭해서 실행 위치로 들어가보자.

함수에 BP를 걸고 F8로 하나씩 실행을 시켜봤다. 그랬더니 CALL 0040890 부분에서 디버깅 당함이라

는 메시지가 출력된다. 그리고 JMP SHORT 0040108B를 통해 JMP SHORT 00401048 가 호출되고

00401048 번지부터 sleep함수 후 다시 IsDebuggerPresent 함수가 실행되어 무한루프 형식으로 실행

되고 있었다.

그렇다면 직감적으로 프로그램 흐름상 실행되지 않고 있는 0040107E, 00401083, 00401088번지에

서 정상 출력값이 나올 것 같다. 그렇다면 저 곳으로 들어가야 하는데 그럼 JE SHORT 0040107E함수에

서 조건이 참이 되야 하므로 TEST EAX,EAX가 참이면 될 것 같다. TEST란 명령어를 몰라 찾아 봤더니

CMP랑 비슷한데 두 개의 Operand를 연산시키는 명령어인 것 같다. 이를 통한다면 0 0 인 경우를 알아

낼 수 있을 것이다. F8로 자세히 보니 비정상인 경우 EAX값에 1이 들어갔다. 그렇다면 이 값을 0으로 바

꿔준다면 원하는 결과를 얻을 수 있을 것 같다. 그렇다면 언제 EAX값을 0으로 넣어줄까 하면서 하나씩

돌려보니 함수호출후에 EAX값이 1로 반환된다. 아마 이 함수의 리턴 값이 정상이면 0 비정상이면 1을

출력하는 것 같다. 그렇다면 비정상일 때 함수 호출 후 반환된 EAX의 1값을 0으로 바꿔 TEST를 진행 시

키면 정상적으로 값이 출력될 것 같다.

실제로 돌려보니 JE SHORT 0040107E 에서 0040107C번지로 넘어가 CALL 00408190이 실행되어

정상적으로 우회가 가능하였다.

다 풀고 찾아보니 문제를 통해 추측했던것처럼 IsDebuggerPreSent 함수가 정상일때 0 비정상일때 1값

을 출력하는 함수가 맞았다. 처음부터 검색했으면 더 쉽게 문제는 풀었겠지만 코드하나하나 분석하면서

공부해가며 풀어 나름 시간이 걸렸던 문제였다.


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 3번  (0) 2018.01.28
code engn basic 2번  (0) 2018.01.27
code Engn Basic 1번  (0) 2018.01.27
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 3번 문제다.

스트링 비교함수 이름을 찾으란다. 파일부터 다운받아보자.

실행하고 입력해보지 에러가 뜬다. 올리디버거로 실행해보자.


이 문제에서 요구하는건 문자열을 볼 수 있느냐 인것 같다. 다음 그림과 같이 Search For -> All referenced test strings를 입력해주면 문자열만 따로 출력을 해준다.

출력된 문자열 목록에서 에러 출력 메시지를 찾아보니 마지막 부분에 다음과 같은 문구들이 보인다.

에러문자열 전에 UNICODE "2G83G35Hs2"라는 값이 뭔가 상당히 의심스럽다.

더블 클릭해서 들어가보자.

들어가보니 함수 값에 인자로 2개의 값을 넣는데 이 때 저 UNICODE 값이 들어가고 vba****라는 함수가 호출된다. 이름부터 문자열 비교함수의 향기가 난다. 이정도 됬으면 대충 감이 왔을 거라고 생각한다.

다음은 추가적으로 저 함수와 위에 두개의 인자가 어떤식으로 동작하는지 보기 위해 break point를 걸

어 동작 시켜 봤다.

돌려보니

이라고 값을 주자

스택 값에 youngsin이라는 입력 값이 들어 갔다.

이를 통해 유추해 보면

1. 내가 입력한 값 push
2. 패스워드 값 push
3. 함수를 통해 두개를 비교 동일하면 성공 틀리면 실패 표시

와 같은 방식으로 동작하는 것 같다.

그러면 입력 값에 패스워드 값을 넣어주면

다음과 같이 성공 표시가 나온다.

위의 값은 code engn에서 요구하는 정답이 아니다. 풀이를 잘 읽어보면 위의 문제에서 원하는 정답은 충분히 유추할 수 있을 것이다.

웹쪽 워게임하다가 감도 어느정도 잡혀가고 있고 머리좀식힐겸 리버싱 간단한 문제들 풀이하고 있는데

아직까진 쉬운개념들만 나와 머리식히기엔 안성맞춤인 것 같다. 리버싱도 웹처럼 재미붙여서 얼른 감을

익혀야 될 것 같다. 


'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 4번  (0) 2018.01.28
code engn basic 2번  (0) 2018.01.27
code Engn Basic 1번  (0) 2018.01.27
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

code engn basic 2번 문제다.

패스워드를 분석하란다. 다운부터 받아보자.


실행시켜봤더니 호환이 안되는지 실패...

올리디버거로 열어봤다.

흠..역시나 실패...

찾아보니 Hex Editor라는 파일의 데이타를 헥사코드 형태로 보여주고 그 코드를 편집할 수 있는 프로그램이 있단다. 파일 종류에 관계없이 열고 수정이 가능하다는 걸로봐서 이걸 통해 열면 파일이 열릴 것 같다.

대충 보니 16진수랑 ascii로 표시되는데 ascii부분보면 느낌이 딱 오는 부분이 있다.

이쯤이면 정답은 대충 짐작했을 거라고 생각한다. 그냥 hex editor 사용할 줄 아냐 물어보는 문제였던

것 같다.



'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 4번  (0) 2018.01.28
code engn basic 3번  (0) 2018.01.28
code Engn Basic 1번  (0) 2018.01.27
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

홈페이지에 있는 파일을 다운받아 실행해 보았다.

일단 실행 해보니 이런식으로 화면이 뜬다.

흠.. HDD를 CD-ROM 처럼 인식하도록 하라는 문제 인 것 같다.

ollydbg를 사용해서 리버싱을 시작해보자.


아직 1번이고 비교적 간단한 문제여서 자세한 설명은 생략하고 해결방법만 간단히 소개하겠다.

해결 방법은 총 3가지가 있다.

첫번째 방법

getDriveTypeA 함수가 호출되면 리턴값으로 3이 발생해 eax에 3값이 들어간다.
이 때 3은 hdd를 의미하며 이 값을 cd-rom을 의미하는 숫자로 변경하면 된다.  

두번째 방법
CMP  EAX,ESI 통해 0값이 나와 점프를 시켜 정상 출력결과를 얻는다.

세번째 방법
JE를 JMP로 바꾸게되면 조건에 상관없이 점프되어 정상 출력결과를 얻게된다.

wargame.kr 문제를 풀기위해 기초지식을 쌓을겸 풀어봤고 상당히 간단한 문제라 포스팅을 자세히는 하지 않았다.

이후 조금 더 어려운 난이도의 문제가 나오게되면 상세히 포스팅 해보도록 하겠다.



'Wargame > CodeEngn' 카테고리의 다른 글

code engn basic 6번  (0) 2018.01.28
code engn basic 5번  (0) 2018.01.28
code engn basic 4번  (0) 2018.01.28
code engn basic 3번  (0) 2018.01.28
code engn basic 2번  (0) 2018.01.27
블로그 이미지

JeonYoungSin

메모 기록용 공간

,