
풀어보겠습니다.

해석해보면
사용자로부터 입력을 요청하는데 형식지정자인 %256을 사용하여 최대 256자의 문자를 받고, 입력이 올바를 때는correct, 입력이 잘못되었을때는 wrong을 출력하는 느낌입니다.
메인함수로 가서 디컴파일링을 해보겠습니다.
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
sub_1400011C0("Input : ", argv, envp);
sub_140001220("%256s", v4);
if ( (unsigned int)sub_140001000(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
데이터 섹션에서 본 것과 같은 내용이 보기 쉽게 담겨있습니다.
sub_140001000함수를 들어가 무슨 내용이 들어있는지 확인해보겠습니다.
1 __int64 __fastcall sub_140001000(__int64 a1)
2 {
3 int i; // [rsp+0h] [rbp-18h]
4
5 for ( i = 0; (unsigned __int64)i < 0x1C; ++i )
6 {
7 if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | ((int)*(unsigned __int8 *)(a1 + i) >> 4)) != byte_140003000[i] )
8 return 0i64;
9 }
10 return 1i64;
11 }
sub_140001000내부 모습입니다.
5라인에서 0x1c인 것을 보니 28번 반복한다는 것을 볼 수 있다, 즉 길이는 28인 것을 알 수 있었습니다.
더보기
[ 1c(16) = 28(10) ] = 16진수 1c는 10진수 28과 같다
연산 과정은 7라인에 나와있습니다.

byte_140003000에 진입하면 나오는 이 값들이 우리가 비교해야할 값인데 코드를 짜서 진행해보겠습니다.

c언어로 코드를 짜보려 했지만 DEV C++ 이슈가 생겨서 파이썬으로 짜봤습니다.
이대로 실행해보면
더보기

플래그 값이 나오게 됩니다.


해당 값으로 넣어보면 정답이 됩니다.
'해킹&보안 > 악성코드 및 치트' 카테고리의 다른 글
| Reverse Engineering 7 (0) | 2024.05.11 |
|---|---|
| Reverse Engineering 6 (0) | 2024.05.10 |
| Reverse Engineering 4 (1) | 2024.03.27 |
| Reverse Engineering 3 (2) | 2024.03.25 |
| Reverse Engineering 2 (0) | 2024.03.25 |