Overview
What’s behind the numeric gate? You only get access if you enter the right kind of number.
Reverse the program behavior and find what input grants access to the secret flag.
Identify
Main function
diberi sebuah file Gatekeeper dan server yang bisa dikoneksikan dengan netcat
❯ nc green-hill.picoctf.net 62563
Enter a numeric code (must be > 999 ):disini kita coba analisis file Gatekeeper di ghidra untuk menemukan function dan input apa yang harus kita masukan
di ghidra dapat ditemukan:
undefined8 main(void)
{
size_t sVar1;
undefined8 uVar2;
long lVar3;
long in_FS_OFFSET;
int local_40;
char local_38 [40];
long local_10;
local_10 = *(long *)(in_FS_OFFSET + 0x28);
printf("Enter a numeric code (must be > 999 ): ");
fflush(stdout);
__isoc99_scanf(&DAT_00102070,local_38);
sVar1 = strlen(local_38);
uVar2 = is_valid_decimal((long)local_38);
if ((int)uVar2 == 0) {
uVar2 = is_valid_hex((long)local_38);
if ((int)uVar2 == 0) {
puts("Invalid input.");
uVar2 = 1;
goto LAB_00101698;
}
lVar3 = strtol(local_38,(char **)0x0,0x10);
local_40 = (int)lVar3;
}
else {
local_40 = atoi(local_38);
}
if (local_40 < 1000) {
puts("Too small.");
}
else if (local_40 < 10000) {
if ((int)sVar1 == 3) {
reveal_flag();
}
else {
puts("Access Denied.");
}
}
else {
puts("Too high.");
}
uVar2 = 0;
LAB_00101698:
if (local_10 != *(long *)(in_FS_OFFSET + 0x28)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return uVar2;
}beberapa informasi yang didapat:
- input menerima bentuk decimal dan hexadecimal
- untuk mentriger
reveal_flag();nilai input kita harus> 1000 & < 10000 - input untuk mentriger flag harus memiliki 3 char
Reveal Flag function
di dalam function reveal_flag ditemukan script
void reveal_flag(void)
{
FILE *__stream;
size_t __n;
void *__ptr;
uint local_24;
__stream = fopen("/flag.txt","r");
if (__stream == (FILE *)0x0) {
puts("Flag file not found.");
}
else {
fseek(__stream,0,2);
__n = ftell(__stream);
rewind(__stream);
__ptr = malloc(__n + 1);
if (__ptr != (void *)0x0) {
fread(__ptr,1,__n,__stream);
*(undefined1 *)((long)__ptr + __n) = 0;
fclose(__stream);
printf("Access granted: ");
local_24 = (uint)__n;
while (local_24 = local_24 - 1, -1 < (int)local_24) {
putchar((int)*(char *)((long)__ptr + (long)(int)local_24));
if ((local_24 & 3) == 0) {
printf("ftc_oc_ip");
}
}
putchar(10);
free(__ptr);
}
}
return;
}ada bagian menarik disini yaitu
while (local_24 = local_24 - 1, -1 < (int)local_24) {
putchar((int)*(char *)((long)__ptr + (long)(int)local_24));
if ((local_24 & 3) == 0) {
printf("ftc_oc_ip");
}
}
putchar(10);
free(__ptr);jadi local_24 atau flag yang di print di reverse dulu dengan looping tersebut, kemudian tiap local_24 bernilai kelipatan 4, maka akan ditambah string ftc_oc_ip
Solving
dari hasil identifikasi, kita bisa menggunakan hex untuk menemukan flagnya, jadi hex yang kita masukan adalah fff, dimana jika di konversikan ke desimal maka hasilnya adalah 4095
ini memenuhi kriteria, dimana input hanya ada 3 karakter namun nilainya diatas 1000 dan dibawah 10000
❯ nc green-hill.picoctf.net 62563
Enter a numeric code (must be > 999 ): fff
Access granted: }e78ftc_oc_ipde8cftc_oc_ipc_99ftc_oc_ip9_TGftc_oc_ip_xehftc_oc_ip_tigftc_oc_ipid_3ftc_oc_ip{FTCftc_oc_ipocipftc_oc_ipsesuai dengan identifikasi di awal, bahwa flag ini telah di reverse dan ditambah string ftc_oc_ip di tiap 4 karakter, maka kita akan hilangkan ftc_oc_ip dulu dan kemudian mereversenya
❯ echo "}e78de8cc_999_TG_xeh_tigid_3{FTCocip" | rev
picoCTF{3_digit_hex_GT_999_cc8ed87e}