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 0x00005555557560400000| 0x555555756040 --> 0x555555757010 --> 0x00008| 0x555555756048 --> 0x555555757100 --> 0x00016| 0x555555756050 --> 0x00024| 0x555555756058 --> 0x00032| 0x555555756060 --> 0x00040| 0x555555756068 --> 0x00048| 0x555555756070 --> 0x00056| 0x555555756078 --> 0x0gdb-peda$ telescope 0x5555557570100000| 0x555555757010 --> 0x00008| 0x555555757018 --> 0x190000000000016| 0x555555757020 --> 0x555555757040 --> 0x555555757100 --> 0x00024| 0x555555757028 --> 0x5555557571f0 --> 0x00032| 0x555555757030 --> 0x00040| 0x555555757038 --> 0x51 ('Q')0048| 0x555555757040 --> 0x555555757100 --> 0x00056| 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-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: 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$ whoamichung96vn$
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.
master kinh vcl :'(
ReplyDelete