Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- x32dbg
- 서비스프로세스
- Exe2Aut
- JIT
- dotPeek
- Dynamic안티디버깅
- UTF-32
- Self-Creation
- 리버싱
- PEImageSwitching
- 디버깅
- .net
- CodeEngn
- PEImage
- 리버싱핵심원리
- IL코드
- DebugBlocker
- 안티디버깅
- hxd
- 서비스디버깅
- Visual Studio
- CP949
- UTF-16
- Advanced안티디버깅
- 분석 보고서
- Static안티디버깅
- ImageSwitching
- OllyDbg
- Python
- RedLine Stealer
Archives
- Today
- Total
-榮-
[CodeEngn] Advance RCE L07 본문
● CodeEngn Advance RCE L07 문제
◎ 파일 실행 화면
◎ 패킹 및 난독화 여부 확인
● CodeEngn Advance RCE L07 풀이
dotPeek에 Advance RCE L07 실행파일을 올리고 [그림 4]의 문자열을 찾았습니다.
If문의 조건 3가지(this.vxzzz(this.yreee, this.ewrrr, 2415736773U, fsfsdf) / (int) this.yreee[2] == (int) hashCode / (int) this.yreee[3] == (int) num1)가 참이 되는 값이 Advance RCE L07의 답입니다.
세 번째 단락 Serial을 00000000부터 ffffffff까지 넣어 If문의 조건 3가지를 만족하는 값을 일 경우 출력하는 코드를 추가하여 답을 찾아봅시다. 우선 코드를 수정하기 위해 Export to Project 해줍니다.
함수의 내용을 파악해 보면 아래와 같습니다.
private void button1_Click(object sender, EventArgs e)
{
string str1 = "";
string str2 = "";
string str3 = "";
ytrewq ytrewq = new ytrewq();
if (this.textBox1.Text.Length < 5 || this.textBox1.Text.Length > 27 || (this.textBox2.Text.Length != 26 || this.textBox2.Text[8] != '-') || this.textBox2.Text[17] != '-')
return; //Name의 길이는 5보다 크도 27보다 작아야하며, Serial의 길이는 26이여야 하고 9번째와 18번째는 '-'이여야 한다.
for (int index = 0; index < 8; ++index) //Serial의 1번째부터 8번째까지의 문자를 가져온다.
str1 += (String)(object)this.textBox2.Text[index];
uint uint32_1 = Convert.ToUInt32(str1, 16); //가져온 문자열을 16진수로 uint32_1에 넣는다.
for (int index = 9; index < 17; ++index) //Serial의 10번째부터 17번째까지의 문자를 가져온다.
str2 += (String)(object)this.textBox2.Text[index];
uint uint32_2 = Convert.ToUInt32(str2, 16); //가져온 문자열을 16진수로 uint32_2에 넣는다.
for (int index = 18; index < 26; ++index) //Serial의 18번째부터 26번째까지의 문자를 가져온다.
str3 += (String)(object)this.textBox2.Text[index];
uint uint32_3 = Convert.ToUInt32(str3, 16); //가져온 문자열을 16진수로 uint32_3에 넣는다.
// 밑으로는 암호화(?)
uint num1 = ytrewq.qwerty(Form1.dfgsf(this.textBox1.Text));
uint hashCode = (uint)this.textBox1.Text.GetHashCode();
uint fsfsdf = uint32_3 ^ hashCode;
this.yreee[0] = uint32_1;
this.yreee[1] = uint32_2;
this.yreee[2] = uint32_1;
this.yreee[3] = uint32_2;
if (!this.vxzzz(this.yreee, this.ewrrr, 2415796773U, fsfsdf) || (int)this.yreee[2] != (int)hashCode || (int)this.yreee[3] != (int)num1)
return; //맞는 Serial이면 Congratulations, meta!를 MessageBox로 출력한다.
int num2 = (int)MessageBox.Show("Congratulations, mate!" + i, "Fine!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
이 Check 버튼 함수에 00000000부터 ffffffff까지 넣어 If문의 조건 3가지를 만족하는 값을 일 경우 출력하는 코드를 추가하면 아래와 같아집니다.
private void button1_Click(object sender, EventArgs e)
{
string str1 = "";
string str2 = "";
string str3 = "";
ytrewq ytrewq = new ytrewq();
if (this.textBox1.Text.Length < 5 || this.textBox1.Text.Length > 27 || (this.textBox2.Text.Length != 26 || this.textBox2.Text[8] != '-') || this.textBox2.Text[17] != '-')
return;
for (int index = 0; index < 8; ++index)
str1 += (char)(object)this.textBox2.Text[index];
uint uint32_1 = Convert.ToUInt32(str1, 16);
for (int index = 9; index < 17; ++index)
str2 += (char)(object)this.textBox2.Text[index];
uint uint32_2 = Convert.ToUInt32(str2, 16);
for (int index = 18; index < 26; ++index)
str3 += (char)(object)this.textBox2.Text[index];
//uint uint32_3 = Convert.ToUInt32(str3, 16); //기존 코드
for (uint i = 0; i < 0xffffffff; i++)
{ //18~26까지의 16진수를 00000000~ffffffff까지 넣어서 정답 출력
uint uint32_3 = i;
uint num1 = ytrewq.qwerty(Form1.dfgsf(this.textBox1.Text));
uint hashCode = (uint)this.textBox1.Text.GetHashCode();
uint fsfsdf = uint32_3 ^ hashCode;
this.yreee[0] = uint32_1;
this.yreee[1] = uint32_2;
this.yreee[2] = uint32_1;
this.yreee[3] = uint32_2;
if (!this.vxzzz(this.yreee, this.ewrrr, 2415796773U, fsfsdf) || (int)this.yreee[2] != (int)hashCode || (int)this.yreee[3] != (int)num1)
continue;
int num2 = (int)MessageBox.Show("Congratulations, mate!" + i, "Fine!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
break;
}
수정한 코드를 실행하면 [그림 8]의 결과 화면이 뜹니다.
코드 수행은 엄청 오래 걸립니다. 따라서 저는 30분 정도 기다리다가 답을 찾아서 그 주변부터 함수를 돌렸습니다.(6시간 정도 걸린다는 말이 있어요...)
나온 결과를 16진수로 변환하면 Advance RCE L07의 답이 나옵니다.
● CodeEngn Advance RCE L07 확인
'CodeEngn > Advance' 카테고리의 다른 글
[CodeEngn] Advance RCE L09 (0) | 2021.04.05 |
---|---|
[CodeEngn] Advance RCE L08 (0) | 2021.04.05 |
[CodeEngn] Advance RCE L06 (0) | 2021.04.02 |
[CodeEngn] Advance RCE L05 (0) | 2021.04.02 |
[CodeEngn] Advance RCE L04 Serial 생성 분석 (0) | 2021.04.02 |