Basic 13번 문제는 MS Visual C#, Basic.NET로 개발되었다.
EP 코드는 위와 같다.
C# .NET 프로그램은 .NET 프레임워크가 없는 환경에서 분석할 수 없다고 한다.
C# .NET 프로그램의 특징은 아래와 같다.
- 관리 기반 코드이다. ( = java JVM처럼 중간언어로 컴파일 되는데, MSIL 이란 언어로 컴파일 된다. )
- 디컴파일이 매우 쉽게 된다.
- 난독화 솔루션 존재하지만, 완벽하진 않더라도 복원해주는 솔루션도 존재한다.
대표적인 디컴파일러는 아래와 같다.
- .NET Reflector
- JetBrains dotpeek(https://www.jetbrains.com/decompiler/)
풀이
JetBrains dotpeek에서 13.exe를 열면 위와 같이 ConsoleApplication3가 생성된다.
Root Namespace -> RijndaelSimpleTest -> Main()를 보면 아래와 같다.
// Decompiled with JetBrains decompiler
// Type: RijndaelSimpleTest
// Assembly: ConsoleApplication3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 2ABE29DC-14E6-4F4B-97CF-81A2ED74FE79
// Assembly location: C:\Users\qtt15\Desktop\codeengn\13.exe
using System;
public class RijndaelSimpleTest
{
[STAThread]
private static void Main(string[] args)
{
string plainText = "";
string cipherText = "BnCxGiN4aJDE+qUe2yIm8Q==";
string passPhrase = "^F79ejk56$£";
string saltValue = "DHj47&*)$h";
string hashAlgorithm = "MD5";
int passwordIterations = 1024;
string initVector = "&!£$%^&*()CvHgE!";
int keySize = 256;
RijndaelSimple.Encrypt(plainText, passPhrase, saltValue, hashAlgorithm, passwordIterations, initVector, keySize);
string str = RijndaelSimple.Decrypt(cipherText, passPhrase, saltValue, hashAlgorithm, passwordIterations, initVector, keySize);
while (true)
{
Console.WriteLine("Please enter the password: ");
if (!(Console.ReadLine() == str))
Console.WriteLine("Bad Luck! Try again!");
else
break;
}
Console.WriteLine("Well Done! You cracked it!");
Console.ReadLine();
}
}
Console.ReadLine() 으로 가져온 입력값이 str과 같아야 문제가 풀린다.
ConsoleApplication3 우클릭 -> Export to Project... -> 폴더 지정 후 Open project in Visual Studio 선택 -> Export
그럼 위와 같이 지정한 폴더 내에 지정한 이름으로 폴더가 생성된다.
VS Code에서 해당 폴더를 열어 RijndaelSimpleTest.cs 파일에서 28번 라인에서와 같이 str을 출력해주는 코드를 삽입하고 저장한다.
dotnet new console --force
VS code 내의 터미널에서 dotnet new console --force를 입력한다.
dotnet run
dotnet run을 입력하면 C# .NET 프로그램의 코드를 실행하는 것이다.
정상적으로 잘 됐다면 위와 같이 아무런 값을 입력해보면 "Leteminman"이 출력된다.
이 값이 바로 str의 값이자 문제의 답이다.
VS code에서 .NET 코드가 실행되지 않을 때
위에서 "dotnet new console --force" 명령어를 입력하면 위의 사진과 같이 Program.cs 파일이 생성된다.
이 파일을 삭제하고 "dotnet run"을 입력하면 된다.
"dotnet run"을 입력했을 때 위와 같은 오류가 난다면
<PropertyGroup>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
[프로젝트명].csproj 파일의 내용을 위와 같이 수정한다.
그리고 다시 "dotnet run"을 입력하면 위와 같이 잘 실행이 된다.
dotnet run 에러 해결 : https://blog.danggun.net/9197
vscode에서 c# 실행하기 : https://sungeun97.tistory.com/m/115
'전쟁 > codeengn' 카테고리의 다른 글
[codeengn] Basic RCE 15 (0) | 2022.07.30 |
---|---|
[codeengn] Basic RCE 14 (0) | 2022.07.30 |
[codeengn] Basic RCE 12 (0) | 2022.07.29 |
[codeengn] Basic RCE 11 (0) | 2022.07.28 |
[codeengn] Basic RCE 10(OEP로 이동 후 덤프) (0) | 2022.07.28 |