sweetchip's blog


백업한 문제중 이 문제를 가장 먼저 풀었는데 200점 바이너리와 함께 Write-up을 쓰려다가 계속 이상한곳만 삽질중이라서 100 부터 쓰기로 했다.


답이 맞는지는 모르겠으나 다른사람 블로그에 들어가서 답을 비교하니 맞았다.



8938765cdf97403089c008e4d4b63d52.exe




비싸보이는 고급 도어락이다.


하지만 100점 문제로 나온걸 보면 싸구려 도어락이라는 것을 알수 있다.


번호키를 누르면 텍스트박스에 입력이 되고 #을 누르면 초기화, * 을 누르면 입력이 된다.



음.. 그렇지만 뭘 눌러도 뚫을순 없었다 ㅠ-ㅠ


음.. 어떻게 할까 하다가 제작년 문제인가 작년문제중 1번이 C#이었던 문제가 기억이 나고 UI가 생각보다 고급스러워서 일단 C#일것 같은 느낌이 들었다.




역시나 감은 틀리지 않았다.


내가 좋아하는 C#.. 하지만 C#은 코드 복호화가 거의 그대로 복구가 가능하다는 깨끗함을 보여준다.


닷넷 리플렉터를 사용해서 어느 함수가 사용되었는지 살펴보도록 한다.



헐.


난독화 되어있는 닷넷이다.


분명히 스튜디오 사이에 껴잇는 닷넷 난독화 프로그램의 짓이 분명하다.


그래도 함수 이름은 그대로 살아있으니 볼만하다..




함수들이 좀 많았는데 AES 도 있었고, XOR연산도 하는 함수등도 있엇다.


아무래도 aes 복호화가 쓰인다는 생각을 하고 그쪽 중심으로 찾아보았다.





음..



음...!!!!!! 젠장 이건가..



음.. 아니면 이건가?



고민을 하던중 가장 간단한 바로 위 사진상의 코드를 다시 짜보았다.


aes 복호화와 xor 연산을 하고, 바이트배열과 aes 키를 넣어주고 코딩한다.



제발 맞아라.. 기도를 하고 F5를 눌렀다




code9ate2013 Start


이런 메세지가 나왔는데...


아.. 아닌가..


라고 생각하고 다른 사람 블로그를 찾아봣는데 저게 답이라고 한다.


'올 ㅋ'


풀이시간 30분..


아;; 이것부터 풀어볼걸 후회되었다.;


Password Is code9ate2013 Start


Source

// Source

// programmed by sweetchip

// 2013.03.06


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Security.Cryptography;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;


namespace Codegate_bin1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}


private void Form1_Load(object sender, EventArgs e)

{

MessageBox.Show(Decrypt(StringToXOR(ByteTostring_t(c)), KeyValue));

}


public string KeyValue = "9e2ea73295c7201c5ccd044477228527";


public byte[] c = new byte[] {

0x3f, 30, 0x39, 0x2f, 20, 0x4e, 50, 0x36, 0x33, 5, 0x25, 0x29, 0x52, 40, 0x45, 30,

0x2a, 0x38, 0x24, 0x49, 60, 0x44, 0x4f, 0x56, 0x18, 0x49, 0x4c, 0x13, 9, 0x1b, 0x2a, 4,

0x52, 0x2a, 0x1c, 0x56, 0x4f, 11, 0x11, 0x3f, 0x17, 14, 0x30, 0x40};


public string StringToXOR(string data)

{

byte[] bt = new byte[data.Length];

bt = this.stringTobyte(data);

for (int i = 0; i < bt.Length; i )

{

bt[i] = (byte)(bt[i] ^ 0x25);

bt[i] = (byte)(bt[i] ^ 0x58);

}

return this.ByteTostring(bt);

}


public static string Decrypt(string textToDecrypt, string key)

{

RijndaelManaged managed = new RijndaelManaged

{

Mode = CipherMode.CBC,

Padding = PaddingMode.PKCS7,

KeySize = 0x100,

BlockSize = 0x100

};

byte[] inputBuffer = Convert.FromBase64String(textToDecrypt);

byte[] bytes = Encoding.UTF8.GetBytes(key);

byte[] destinationArray = new byte[0x20];

int length = bytes.Length;

Array.Copy(bytes, destinationArray, length);

managed.Key = destinationArray;

managed.IV = destinationArray;

byte[] buffer4 = managed.CreateDecryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);

return Encoding.UTF8.GetString(buffer4);

}


public string ByteTostring_t(byte[] buf)

{

return Encoding.UTF8.GetString(buf);

}


public static double ConvertByteArrayToInt32(byte[] b)

{

return (double)BitConverter.ToInt32(b, 0);

}


public static byte[] ConvertInt32ToByteArray(int I32)

{

return BitConverter.GetBytes(I32);

}


public string ByteTostring(byte[] bt)

{

string str = "";

for (int i = 0; i < bt.Length; i )

{

str = str Encoding.Default.GetString(bt, i, 1);

}

return str;

}

public byte[] stringTobyte(string str)

{

return Encoding.UTF8.GetBytes(str.ToCharArray());

}



}

}




2013/03/08 - [0x10 정보보안/0x14 Reverse Engineering] - 2013 CODEGATE YUT BINARY 300 Write-up | 2013 코드게이트 바이너리 300 풀이


2012/08/11 - [0x10 정보보안/0x13 Write-Up] - 코드게이트 2011 예선 바이너리 문제 풀이












이대로 끝내긴 좀 뭐해서 도어락 비밀번호를 얻어내기로 했다.


비밀번호는 현재 AES암호화 -> 0x15 XOR 연산 상태로 저장되어있다.


그래서 거꾸로 0x15 XOR -> AES 복호화 를 해주면 원래 문자열을 얻을 수 있다.


Crypted : @DT$:~zRbD_!qFWQMAtC's[_t:&&YF\x007fWQE ^o-EBAr%(


함수를 만들지 말고 xortostring 함수를 그대로 쓰면된다.


그리고 AES 복호화..


그리고 메세지 박스로 나타나도록 코딩한다.



도어락의 키를 알아냈다! 1987111020130301


1987년 11월 10일? 아무래도 제작자와 관련이 있지 않을까?


2013년 03월 01은 CodeGate Yut 이 시작된 날이다.


아무튼 이 비밀번호로 도어락을 뚫어보자.



위처럼 숫자를 입력하면








확인사살!


Flag Is code9ate2013 Start

신고

Comment 13

  • 2013.03.14 01:13 수정 답글

    비밀댓글입니다

    • 2013.03.14 17:57 신고 수정

      ㅠㅠ 그러면 못뵈겟군요....
      감사합니다 ㅎㅎ 많은 분들에게 유익한 발표를 하도록 노력하겠습니다.

  • godokan
    2013.04.03 02:07 신고 수정 답글

    풀이 잘보았습니다.
    많은 도움됐구요 감사합니다.

  • 2013.04.04 02:38 수정 답글

    비밀댓글입니다

    • 2013.04.04 14:12 신고 수정

      안녕하세요 ㅎㅎ

      오늘 뵐수도 있을것 같은데요 ㅋㅋ 어제 코드게이트 주니어 발표자로 참석했습니다.

      주제는 뮤직플레이어 exploit 으로 참석했엇고 오늘 지금 코엑스에서 답글 드립니다 :D ㅋㅋㅋㅋ

      싸구려 도어락은 그냥 재미로 말한것이니 오해 없으시길 바랍니다 ㅎㅎ;

      감사합니다~

  • WISKER
    2013.05.13 21:41 신고 수정 답글

    코드는 직접 즉흥적으로 짜시는건가요..???

    • 2013.05.13 22:09 신고 수정

      이문제의 경우엔 저렇게 디컴파일이 가능해서 저곳에 있는 배열등은 그대로 가져오고 그냥 재구성해서 풀면됩니다.

      필요한부분은 구글링을 해서 가져올수도 있고 직접 프로그래밍 할수도 있습니다.

  • KERRY
    2013.05.18 01:04 신고 수정 답글

    흠.. 궁금한게 있습니다. 해당 키들은 복호화하기 위해 프로그래밍하신거같은데. 꼭 굳이 프로그래밍하지 않고
    복호화사이트에서 해도 되지 않나요? 좀 멍청한 질문인가요.. 궁금해서여 ㅠ

    • 2013.05.18 01:27 신고 수정

      aes의경우 말씀하신것처럼 하셔도 됩니다!
      하지만 저의 경우 문제내에 제작자의 배려로 복호화 소스도 있어서 그냥 복붙해서 더 빨리 풀수 있었습니다 ㅎㅎ;;

  • 2013.08.25 20:05 수정 답글

    비밀댓글입니다

  • 2013.08.25 20:05 수정 답글

    비밀댓글입니다

    • 2013.08.25 22:46 신고 수정

      안녕하세요. 궁금하신것이 있으시면 저도 잘하지는 못하지만 최대한 답변해드리겠습니다.. ^^;; 메일 주실때 내용을 구체적으로 말씀해주시면 감사하겠습니다. 주소는 sweetchip@studyc.co.kr 입니다.