Simple Reverse Engineering. Can you Reversing for C# Application?
c# 크랙미라고 한다. c#은 리플렉터라고 해서 디컴파일러가 정말 개짱많다. 아무거나 구해서 열어보기로 했다
main은 이렇게 이루어져있다
private static void Main(string[] args) { Console.Write("Input your name : "); string name = Console.ReadLine(); Console.Write("Password : "); string str2 = myEncrypt(Console.ReadLine(), name); if ((name == "BluSH4G") && myCmp(str2, getps(name))) { Console.WriteLine("\n::Congratulation xD ::\n"); } else { Console.WriteLine("\n:: WTF AUTH FAILED ::\n"); } }
name은 BluSH4G 라고 한다.
그런데 비밀번호는 myEncrpyt에 name을 넣은값을 입력해야한다고 한다. 안볼수 없지
private static string myEncrypt(string strKey, string name) { DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); provider.Mode = CipherMode.ECB; provider.Padding = PaddingMode.PKCS7; byte[] bytes = Encoding.ASCII.GetBytes(mPadding(name)); provider.Key = bytes; provider.IV = bytes; MemoryStream stream = new MemoryStream(); CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(), CryptoStreamMode.Write); byte[] buffer = Encoding.UTF8.GetBytes(strKey.ToCharArray()); stream2.Write(buffer, 0, buffer.Length); stream2.FlushFinalBlock(); string str = Convert.ToBase64String(stream.ToArray()); stream2 = null; stream = null; provider = null; return str; }
myEncrpyt는 이렇게 생겼다.
서버에 아이디를 넣어 호출해주면 비밀번호가 돌아오는데(getps) 비밀번호가 매치하도록 작성해야하는것 같다.
역시 서버를 통하기때문에 전사공격은 어려워보인다. 우선 스니핑을해서 name을 입력했을때 돌아오는 값을 확인해 저장해두었다.
먼저 myEncrpyt function을 분석해봐야 할 것 같다.
먼저 bytes에 name을 꾸겨넣는데 mPadding을 거친다
private static string mPadding(string s) { int length = s.Length; if (length != 8) { if (length > 8) { return s.Substring(length - 8); } for (int i = 0; i < (8 - length); i++) { s = s + "*"; } } return s; }
name은 BluSH4G 이니 7자이다. 고로 8자가 될때까지 *를 붙이는 패딩을 수행한다. 7자이므로 8자까지 채워
BluSH4G* 가 되었다
그 이후 key와 IV는 동일하기 때문에 이제 DES를 decrypt 하면 된다.
나는 des decrpyt online 뭐 이런식으로 검색했던거 같다. MODE는 소스코드상에 ECB라고 나와있으니 선택하고..
답이 나왔다.