Patch 기법을 사용하는 문제이다.
ida에 main.exe를 넣고 ok, yes를 누른다.(아무 것도 건드리면 안됨)
그 후 f5로 디컴파일(C 코드 보기)를 할 수 있는데
그러면 아주 노골적인 이름의 patchme
함수를 발견 할 수 있다.
더블 클릭 후 들어가서 tab을 눌러 다시 어셈블리 언어를 본다.
call sleep
에 커서를 두고, Edit > Patch program > Assemble을 클릭.
함수가 하나로 연결될 때까지 5번 nop을 입력 후 ok를 누르면 된다.
그 후 Edit > Patch program > Apply patches to input file…을 누르면 끝!
플래그: DIMI{NOPpatch_is_also_important}
main 함수를 보자.
__int64 __fastcall main(int a1, char **a2, char **a3)
{
int v3; // edx
char *v4; // rax
__int64 i; // rax
const char *v6; // rdi
char v8[58]; // [rsp+8h] [rbp-90h] BYREF
char v9; // [rsp+42h] [rbp-56h] BYREF
unsigned __int64 v10; // [rsp+88h] [rbp-10h]
v10 = __readfsqword(0x28u);
__isoc99_scanf("%59s", v8);
v3 = 99;
do
{
v4 = v8;
do
{
*v4 ^= v4[1];
++v4;
}
while ( v4 != &v9 );
--v3;
}
while ( v3 );
for ( i = 0LL; i != 58; ++i )
{
if ( byte_4020[i] != v8[i] )
{
v6 = "No";
goto LABEL_10;
}
}
v6 = "That's Flag";
LABEL_10:
puts(v6);
return 0LL;
}
루틴은 아래와 같음.
xor
“No”
출력, 일치하면 “That’s flag”
출력포인터에 대한 이해가 좀 필요한 문제이다.
v8
은 input이다.