Wargame | CTF/Reversing

    CodeEngn Advance01 풀이

    드디어 베이직이 끝나고 어드벤스드로 들어왔네요 ㅎㅎㅎ... 엄청오래걸렸지만 ㅠㅠ 이문제는 베이직에서 본거랑비슷하네요 time 관련함수를 찾아볼까요 일단 안티디버깅이 되어있으니 피해주시구요timeGetTime 함수로 시스템시간을 받아오고 있네요. 함수를 두번 실행시킵니다.두개의 함수의 차를 구합니다. 그리고 ebx+4에 있는 어떤값이랑 비교해서 그값보다 크면 점프합니다.ebx+4 에 있는 값은 337B로 10진수로는 13179입니다. 13179ms 후에 프로그램은정지됩니다.정답은 MD5 해시로 변환하라고 했으니까 변환하면.. DB59260CCE0B871C7B2BB780EEE305DB 입니다.풀이완료 !

    CodeEngn Basic20 풀이

    crackme3.key 안의 파일의 데이터가 무엇인지 구하는 문제입니다. 코드는 매우 간단하고 직관적으로 되어있습니다. crackme3.key 파일을열고 그안의 12바이트데이터를 불러옵니다.파일은 굳이 만들지않고 없을시에 다른곳으로 점프하는걸 막아서 파일이 있는척했습니다. ReadFile함수이후의 분기점에서도 그냥 넘어가게 해두었구요 알고리즘은 직접 한줄씩 트레이싱 해보면 간단하게 알수있습니다.중요하게봐야할 부분은 주소 401079 부분 부터인데요 여기서 4020F9주소에 12345678과 xor 한값을 넣습니다. 이값은 나중에 eax와 비교해서 크랙성공메세지를 띄우게할 값입니다. 그밑의 40108B부분으로 들어가보겠습니다. 여기서 4020F9주소의 값과 비교할 eax값을 세팅해주는 중요한 부분입니다. ..

    CodeEngn Basic19 풀이

    이 프로그램이 몇밀리세컨드 이후에 종료되는지에대한 문제입니다. 이런창이 뜨면서 일정시간 이후에 자동으로 종료하게 됩니다. 디버거로 열게되면 이런 메세지를 띄우게됩니다. 안티디버깅 기법이 적용되어있나보네요 . 시간에 관련된거라 생각하면서 트레이싱 하다보니 뭔가 있었는데 메세지박스가 실행이 되지않는걸로보아 여기는 아니네요.디버깅을 감지하는 함수를 발견했습니다. 여기에 bp를 걸어주시고 안티디버깅을 우회하기위해서 ZF를 1로 변경해 주었습니다. 점프를 하지못하게요. 프로그램을 실행하면 보이는 Msgbox의 text string은 참조된 문자열목록으로 봤을때 뜨질않아서 하드코딩한게 아닌 내부적으로 문자열을 만들어 낸다고 생각해서 트레이싱해보니 역시나 맞았습니다. MsgBox 내부에는 또 MessageBoxExW..

    CodeEngn Basic18 풀이

    Name이 CodeEngn일때 Serial을 찾는 문제입니다. 테스트를 위해 임의로 값을 입력해줍시다.All referenced text strings으로 성공메세지를 띄우는곳으로 가주시구요코드가 아주 보기좋게 되어있습니다. CodeEngn을 통해 어떤키값을 생성후에 내가입력한 시리얼값과 비교하고있습니다. 동일하면 성공메세지를 띄웁니다. 시리얼값이 다 드러나있네요. 정답은 06162370056b6ac0 입니다. 풀이완료!

    CodeEngn Basic17 풀이

    이건좀 특이하네요 앞전문제와 반대입니다. 키값을 알려주고 그에따른 Name값을 알아내라고하네요.여기서 Check it 값을 누르면 key값에 있는 값이 비워지고 문자를 더입력하라고 나옵니다. 올리디버거로 확인해보겠습니다. All referenced text strings로 확인해본결과 패킹되어있지않아서 다 드러납니다. 성공메세지 출력하는곳으로 가줍니다.45BB22 의 주소에서 사용자가 Name에 입력한 문자열의 길이를 받아온후에 45BB24의 주소에서 상수 3이랑 비교합니다.원래 45BB27의 주소에는 JGN 0045BB3E 였으나 제가 JMP로 어셈블하였습니다. Name이 3글자 미만이면 Serial안의 내용을 Please Enter More Chars...로 바꿔버립니다. 문제에서는 Name이 한글자..

    CodeEngn Basic16 풀이

    이전문제랑 마찬가지로 이름을 입력받고 그에해당하는 시리얼을 입력하는 방식입니다. 콘솔응용프로그램으로 제작된 프로그램이군요. 패킹은 되어있지않은것같습니다. Ollydbg로 분석해보겠습니다.역시 전문제와 마찬가지로 All referenced text strings 로 검색해보니 성공메세지를 띄우는곳이 다드러납니다. 그쪽으로 가줍시다. 패스워드를 입력받는 부분입니다. 그후에 입력받은 Name으로 구한 어떤 값이랑 비교해서 같으면 점프하지않고, 성공메세지를 띄웁니다.시리얼값은 E4C60D97으로 10진수로 변환하면 3838184855 입니다. 정답이네요풀이완료 !

    CodeEngn Basic15 풀이

    name이 CodeEngn 일때, 시리얼을 구하랍니다. 단순한 문제입니다 내부알고리즘을 분석하면되겠군요. 다행히 패킹되어있지는 않습니다. 시리얼을 임의로 123으로입력해줍니다. Ollydbg로 분석하겠습니다 . All referenced text strings로 보면 패킹이되어있지않아서 그대로다 드러납니다.성공메세지가 있는곳으로 가줍니다. 단순하게 제가 입력한 값이랑 CodeEngn이라는 글자로 만들어낸 시리얼값을 비교해서 같으면 성공메세지를 띄웁니다. EAX에 있는 7B값은 10진수로 제가 입력한 123입니다. CodeEngn에 해당하는 시리얼값은 6160으로 10진수로변환하면 24928입니다. 24928을 입력하니 맞다고 뜨네요 풀이완료!

    CodeEngn Basic14 풀이

    이름이 CodeEngn 일때 시리얼을 구하랍니다. 정답은 여러개가나올수있고 5개의 숫자로된 정답을 찾으라네요. 프로그램을 한번실행해 봅시다.입력받는 박스가 두개가 있네요. 체크버튼을 누르면 시리얼과 비교해서 결과화면을 띄웁니다.쉬운 UPX패킹 방식입니다. 손쉽게 OEP를 찾아줍시다. (문자길이를 구해서 그 길이만큼 반복)1.문자가 저장된곳에 접근 2.해당문자에서 1글자만 따옴3.해당문자 아스키코드값을 제곱한다.4.그값을 ESI에 더한다.5.해당문자 아스키코드값을 오른쪽으로 1칸시프트한다.6.시프트한값을 ESI에 더한다.7.ESI에 다시 해당문자아스키코드값을 더한다.8.EAX값을 증가시키고 ECX값을 감소시킨다. ECX값이 0이될때까지 반복한다. 최종적으로 ESI에 누적된 값을 스택에 푸시한다. 밑칸에 있..

    CodeEngn Basic13 풀이

    코드엔진 Basic 13번 문제입니다. 정답을 찾으라네요. 그냥 제작자의 의도대로 문제를 풀라는것같아요.일단 PEiD로 패킹이 혹시 되어있는가 확인해보겠습니다.C#으로 작성된 프로그램이라는데요 패킹은 없는것같습니다. 혹시 콘솔응용프로그램 일까요..? 실행시켜보겠습니다.예 콘솔응용프로그램이 맞습니다. 사용자로부터 문자열을 입력받고, 저장된 패스워드와 비교를 해서 성공메세지를 띄우는거 같네요. 올리디버거로 가보겠습니다.음.. 올리디버거로 열리긴하는데 그냥 공백화면만 뜨네요.. 왜그럴까요 좀더 고민해보곘습니다. PEView로 파일을 한번살펴보겠습니다.한참헤메다가 인터넷검색찬스... C# 디컴파일러를 이용하라네요 .......... 한시간동안 삽질했네요 디컴파일러를 이용하니 쉽게 디컴파일되어서 세세한 메소드 내..

    CodeEngn Basic12 풀이

    Basic12번입니다. 성공메세지대신에 정답 Key값을 띄우라는군요.key값도 구해야하고 그 키값이 있는 공간으로 접근해서 MessageBox 파라메터값도 수정해야겠군요. 일단 파일을 실행시켜봅시다. 키값을 입력하면 성공메세지를 출력하겠군요 올리디버거로 가봅시다.코드는 매우 간단합니다. 에디트박스 에서 입력받은값과 7A2896BF를 비교해서 같으면 성공메세지를 띄웁니다.10진수로 변환하면 2049480383 성공키가 됩니다. 이제 이 키 값을 성공메세지의 내용으로 띄우려면 메세지박스의 세번째파라메터인 0040353B 공간에있는 문자를 키값으로 변환해주면 됩니다. HexEdit로 열어봅시다.일단 PEView로 그 0040353B라는 공간이 파일에서는 어디에 있는지 찾아야겠죠? ImageBase 는 0040..

    CodeEngn Basic11 풀이

    Basic11번 문제입니다. OEP와 StolenByte를 찾으라는군요. 당연히 패킹이 되어있겠죠? PEiD로 확인해줍시다.UPX패킹이니 간단하게 PUSHAD 에서 하드웨어브레이크를 걸고 달려줍니다.POPAD가 있고 그밑에 OEP로 점프하는 코드가 있습니다. MessageBox의 파라메터 3개를 미리 스택에 넣는걸로봐서 저 12바이트의 OPcode가 StolenByte라고 추측할수 있겠군요. OEP로 가봅시다.역시 예상대로 12바이트가 NOP으로 채워져있습니다. 여기에 StolenByte를 끼워넣어줍시다. 그리고 덤프를떠주면 끝! 답은 나왔네요 OEP+StolenByte 가 정답입니다.풀이완료 !

    CodeEngn Basic10 풀이

    Basic 10번문제입니다. PEiD로 한번 보겠습니다.처음보는 패킹이군요. 실행을 한번 시켜보겠습니다.이름과 시리얼을 입력하는 부분이 보이네요. EditBox 부분에는 키보드 입력이 되지않습니다. 코드상에서 수정해야되나 봅니다. 올리디버거로 가보겠습니다.음.. UPX 패킹과 동일하게 처음부분에 PUSHAD 하는 부분이 있습니다. POPAD가 있고 그뒤에 점프문이 있을까요...?? POPAD가 있고 JMP 문대신 RETN문이 있습니다. 그쪽으로 이동하게되면...알수없는 코드들이 나오게됩니다. 아마도 패킹때문이겠죠..?? 덤프를 뜬후 다시 덤프뜬파일을 올리디버거에 올려보았습니다. 참조된 String 목록을보니.. well done이라는 문구도 보이고 제대로 찾아온것같네요 그럼 OEP 는 00445834 이..

    CodeEngn Basic09 풀이

    StolenByte를 구하라는 문제입니다. 훔쳐진바이트..?? 모르겠습니다.일단 어떤파일인지 PEiD로 보겠습니다. 일단 UPX로 패킹되어있는걸 알아냈습니다. 동적분석을위해 한번 실행해 보겠습니다. 키파일 체크를위해 ok를 누르랍니다. 눌렀더니 파일이없다고 하네요 ok를 누르게되면 어떤특정파일이 있는지없는지 비교를 하는것같습니다. 올리디버거로 가서 한번보겠습니다. UPX패킹이니 하드웨어브레이크를 걸고 달리겠습니다. OEP를 쉽게 찾아냈습니다.OEP로 가보니.. 코드가 매우 간단합니다. 어셈블리어로 작성된것같습니다. 파일을생성하고, 파일이 없으면 에러문구로 점프, 파일이 생성되있어도 파일사이즈를 구한뒤 18바이트이어야 성공메세지로 점프하는군요.왜 CreateFile함수가 실행되는데도 파일이 안만들어질까 해..

    CodeEngn Basic08 풀이

    Basic08 풀이입니다. OEP를 구하라는군요. 패킹이 되어있나봅니다... 아오파일을 받아보니 파일은 그냥 단순한계산기 입니다. 역시나.. UPX 패킹이 되어있습니다. 올리디버거로 가보겠습니다.OEP를 찾는문제이므로 간단하게 풀었습니다.. 하드웨어브레이크를 걸고 POPAD까지 이동..JMP 문까지 이동 풀이완료..!? OEP를 찾았습니다. 먼가 찝찝하네요 이동해보니 PE헤더 코드부분이 있었습니다 맞는것같네요.

    CodeEngn Basic07 풀이

    Basic07 번째 문제입니다. C드라이브의 이름으로 시리얼을 생성하는 프로그램인것같습니다. 실행시켜보겠습니다.시리얼을 입력받고 체크하는 단순한 프로그램입니다. 일단패킹 여부를 확인해보겠습니다. 음 패킹은 되어있지않은것같네요.올리디버거로 가보겠습니다.어셈블리어로 작성이 되었는지 코드가 매우 간결합니다. 4562-ABEX 에서 4567 한자리각각 1씩 더하는작업을 두번해준뒤 L2C-5781 뒤에 덧붙여준것이 시리얼이군요.시리얼은 쉽게 풀었고 코드엔진의 문제를 해결해 보겠습니다.GetVolumeInformation 함수안을 살펴볼까요 일단 인수는 8개나 받는 함수입니다. 성공하면 0이아닌값을 반환하고 실패하면 0을 반환합니다.드라이브 이름에 관한 질문이므로 GetVolumeInformation의 2번째 인수..