일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- reversing
- Python
- termux
- writeup
- Hackerschool
- NewsClipping
- 보안뉴스
- 어셈블리어
- CodeEngn
- RITSEC
- x64dbg
- ftz
- SQL Injection
- BOF
- 리눅스
- RITSEC CTF 2019
- ctf
- requests
- 리버싱
- Nop Slide
- buffer over flow
- PWN
- Next.js
- Shadow 동아리
- 웹해킹
- 버퍼오버플로우
- Linux
- 뉴스클리핑
- webhacking
- HackCTF
Archives
- Today
- Total
Jaeseo's Information Security Story
Codeengn Basic RCE 15번 문제 본문
Basic RCE L15
Name이 CodeEngn일때 Serial을 구하시오
일단 PE 분석을 하면서 시작합니다.
아무런 Packing이 안되어 있는 모습을 볼 수 있습니다.
이런식으로 Name과 Serial를 입력 하고 Check를 하는 프로그램입니다. 이제 IDA로 정적분석을 합니다.
일단 메인 함수로 추정되는 위치입니다.
void __noreturn start()
{
int v0; // eax
Sysinit::__linkproc__ InitExe(&dword_458990);
sub_44119C(*off_45A58C);
sub_440DD8(*off_45A58C, &str_CrackMe_1__UBC_[1]);
// 프로그램에 대한 이름을 설정하는 항목으로 예상된다.
TApplication::CreateForm(*off_45A58C, &cls_Unit1_TForm1, off_45A664);
// 델파이를 이용하여 폼을 생성한다.
TApplication::CreateForm(*off_45A58C, &cls_Unit2_TForm2, off_45A684);
v0 = Forms::TApplication::Run((Forms::TApplication *)*off_45A58C);
System::__linkproc__ Halt0(v0);
}
일단 델파이를 이용하여 프로그램을 제작하였다는 점을 확인 하였습니다. 이제 ALT + t를 이용해서 문자열을 검색 해봤습니다.
CODE:00458880 _str_You_cracked_the dd 0FFFFFFFFh ; _top
CODE:00458880 ; DATA XREF: _TForm1_Button1Click+39↑o
CODE:00458880 dd 85 ; Len
CODE:00458880 db 'You cracked the UBC CrackMe#1 ! Please send your solution to ubcr'; Text
CODE:00458880 db 'ackers@hotmail.com !',0; Text
CODE:004588DE align 10h
CODE:004588E0 _str_CRACKED dd 0FFFFFFFFh ; _top
위와 같이 성공 했을때에 대한 문자열을 찾았고 _TForm1_Button1Click()함수에서 참조를 하고 있다는 것을 보았습니다. 이제 함수에 들어가 분석을 합니다.
int __fastcall TForm1_Button1Click(int a1)
{
int v1; // ebx
int v2; // edx
unsigned int v4; // [esp-10h] [ebp-14h]
void *v5; // [esp-8h] [ebp-Ch]
int v6; // [esp+0h] [ebp-4h]
int savedregs; // [esp+4h] [ebp+0h]
v6 = 0;
v1 = a1;
v4 = __readfsdword(0);
__writefsdword(0, (unsigned int)&v4);
sub_458760();
//여기서 dword_45B844에 대해 Serial를 생성하고 저장
TControl::GetText(*(TControl **)(v1 + 720));
if ( sub_407774(v6) == dword_45B844 ) //0x45B844에서 4byte를 읽어와 비교
//위의 sub_407774(v6)는 serial 필드의 데이터를 가져오는 것 으로 보인다.
{
Dialogs::ShowMessage((Dialogs *)&str_You_cracked_the[1], v2);
Controls::TControl::SetText(dword_45B83C, (const int)&str_CRACKED[1]);
}
else
{
Dialogs::ShowMessage((Dialogs *)&str_Try_Again__[1], v2);
}
__writefsdword(0, v4);
v5 = &loc_45887B;
return System::__linkproc__ LStrClr(&v6);
}
일단 분석을 해보니 dword_45B844의 값을 읽어 비교를 하는 작업을 하여 처리를 하는데 이때 X64DBG를 통해 동적으로 분석을 하여 Name이 CodeEngn일때의 0x45B844의 데이터를 살펴 봅니다!
이때 00006160이 저장되어 있는 걸 볼 수 있는데 10진수로 바꿔서 확인해봅니다. 그러면 24928 이러한 결과값이 나오는데 이걸 테스트 해보면 정상적으로 동작하는 것을 볼 수 있습니다.
AUTH:24928
'Write UP > Codeengn - basic' 카테고리의 다른 글
Codeengn Basic RCE 16번 문제 (0) | 2019.12.03 |
---|---|
Codeengn Basic RCE 14번 문제 (0) | 2019.12.01 |
Codeengn Basic RCE 13번 문제 (0) | 2019.11.30 |
Codeengn Basic RCE 12번 문제 (0) | 2019.11.30 |
Codeengn Basic RCE 11번 문제 (0) | 2019.11.30 |
Comments