Tokyo Westerns CTF 2018 - swap returns

0x00. Introduction

[*] '/home/user/swap_returns'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

Concept

int __fastcall __noreturn main()
{
  ...
      print_menu();
      choice = read_int();
      if ( choice == 1 )
      {
        puts("1st address: ");
        __isoc99_fscanf(stdin, "%lu", &first);
        puts("2nd address: ");
        __isoc99_fscanf(stdin, "%lu", &second);
      }
      if ( choice == 2 )
      {
        tmp = *first;
        *first = *second;
        *second = tmp;
        tmp = 0LL;
      }
  ...
}

๊ฐ’์„ ๋‘ ๊ฐœ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ทธ ๊ฐ’์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๋‘ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’์„ ์„œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

0x01. Vulnerability

๋ฌธ์ œ์—์„œ ๊ฐ•๋ ฅํ•œ primitive๋ฅผ ์ฃผ์—ˆ์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ํ•ด๋ณผ ๋งŒํ•œ ๊ฒƒ์ด ์—†์—ˆ๋‹ค.

์šฐ์„  ์ง€๊ธˆ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๊ณ , ๊ณ ์ •์ ์ธ ์ฃผ์†Œ๊ฐ’๋“ค๋ผ๋ฆฌ swap์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ ๋จผ์ € ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์ด ๋งž๋Š” ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

Start              End                Offset             Perm Path
0x0000000000400000 0x0000000000401000 0x0000000000000000 r-x /home/user/swap_returns
0x0000000000600000 0x0000000000601000 0x0000000000000000 r-- /home/user/swap_returns
0x0000000000601000 0x0000000000602000 0x0000000000001000 rw- /home/user/swap_returns
0x00007ffff7d87000 0x00007ffff7d8a000 0x0000000000000000 rw-
0x00007ffff7d8a000 0x00007ffff7db2000 0x0000000000000000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7db2000 0x00007ffff7f47000 0x0000000000028000 r-x /usr/lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7f47000 0x00007ffff7f9f000 0x00000000001bd000 r-- /usr/lib/x86_64-linux-gnu/libc.so.6
0x00007ffff7f9f000 0x00007ffff7fa0000 0x0000000000215000