백업한 문제중 이 문제를 가장 먼저 풀었는데 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());
}
}
}
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
Secuinside 2013, Game, PE time Write up (8) | 2013.05.27 |
---|---|
2013 CodeGate YUT Binary 200 | 2013 코드게이트 바이너리 200 풀이 (0) | 2013.03.10 |
2013 CODEGATE YUT BINARY 300 Write-up | 2013 코드게이트 바이너리 300 풀이 (1) | 2013.03.08 |
윈도우7 지뢰찾기 분석! - 리버싱과 맵핵[?] (11) | 2013.01.22 |
지뢰찾기 지뢰 위치 [맵핵?] - C# (2) | 2013.01.21 |