[HackCTF] :pwn: RTL_World

두비니

·

2021. 3. 15. 23:59

 

 

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  int v4; // [esp+10h] [ebp-90h]
  char buf; // [esp+14h] [ebp-8Ch]
  void *v6; // [esp+94h] [ebp-Ch]
  void *handle; // [esp+98h] [ebp-8h]
  void *s1; // [esp+9Ch] [ebp-4h]

  setvbuf(stdout, 0, 2, 0);
  handle = dlopen("/lib/i386-linux-gnu/libc.so.6", 1);
  v6 = dlsym(handle, "system");
  dlclose(handle);
  for ( s1 = v6; memcmp(s1, "/bin/sh", 8u); s1 = (char *)s1 + 1 )
    ;
  puts("\n\nNPC [Village Presient] : ");
  puts("Binary Boss made our village fall into disuse...");
  puts("If you Have System Armor && Shell Sword.");
  puts("You can kill the Binary Boss...");
  puts("Help me Pwnable Hero... :(\n");
  printf("Your Gold : %d\n", gold);
  while ( 1 )
  {
    Menu();
    printf(">>> ");
    __isoc99_scanf("%d", &v4);
    switch ( v4 )
    {
      case 1:
        system("clear");
        puts("[Binary Boss]\n");
        puts("Arch:     i386-32-little");
        puts("RELRO:    Partial RELRO");
        puts("Stack:    No canary found");
        puts("NX:       NX enabled");
        puts("PIE:      No PIE (0x8048000)");
        puts("ASLR:  Enable");
        printf("Binary Boss live in %p\n", handle);
        puts("Binart Boss HP is 140 + Armor + 4\n");
        break;
      case 2:
        Get_Money();
        break;
      case 3:
        if ( gold <= 1999 )
        {
          puts("You don't have gold... :(");
        }
        else
        {
          gold -= 1999;
          printf("System Armor : %p\n", v6);
        }
        break;
      case 4:
        if ( gold <= 2999 )
        {
          puts("You don't have gold... :(");
        }
        else
        {
          gold -= 2999;
          printf("Shell Sword : %p\n", s1);
        }
        break;
      case 5:
        printf("[Attack] > ");
        read(0, &buf, 0x400u);
        return 0;
      case 6:
        puts("Your Not Hero... Bye...");
        exit(0);
        return result;
      default:
        continue;
    }
  }
}

 

너무 길어서 코드로 가져왔습니다.

문제는 간단해요

system의 주소와 /bin/sh의 주소까지 가져오고, 돈만 있으면 주소 자체를 제공해줍니다.

그리고 마지막 5번 선택지를 통해서 Binary Boss를 이기면 되는데, 0x8C짜리 buf에 0x400씩 입력받고 있기 때문에 바로 RTL을 진행해 주면 될 것 같습니다.

 

그럼 우선 돈을 얻어야 할 것 같은데

 

 

2번 선택지인 get_money()안에 히든 선택지가 있네요. 한번 확인해봅시다.

 

 

 

충분히 큰 돈을 줘서 그냥 진행해도 괜찮을 것 같네요

그리고 참고로 위에 코드를 보면 rand함수를 초기화하지 않고 사용하고있어서 항상 저 숫자를 준다는 것 또한 확인할 수 있습니다.

 

 

 

 

 

 

 

굳굳

+) 어디선가 똑같은 문제를 푼거같은데 기분탓인가..?

'War Games > HackCTF' 카테고리의 다른 글

[HackCTF] :pwn: poet  (0) 2021.03.18
[HackCTF] :pwn: g++pwn  (0) 2021.03.17
[HackCTF] :web: 보물  (0) 2021.03.14
[HackCTF] :web: /, Hidden, Button (All 50 pts)  (0) 2021.03.13
[HackCTF] :rev: Handray  (0) 2021.03.12