0CTF 2017 Quals: EasiestPrintf (pwn 150)

Warm UP! A traditional Format String Attack.

It’s running on Debian 8.

nc 202.120.7.210 12321

EasiestPrintf

libc.so.6_0ed9bad239c74870ed2db31c735132ce

 

Trong thời gian chuẩn bị HITB GSEC CTF 2017, mình ngồi lục lại các bài pwn trong giải 0CTF 2017 Quals luyện tập.

Nhìn lên nhìn xuống thấy có 2 bài dễ nhất là char 130 points, EasiestPrintf 150 points.

Cơ mà mình lại thích Format String nên chọn EasiestPrintf.

$ file EasiestPrintf
EasiestPrintf: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=61cd88e3d189854473fddf7c0ace6450986e4b02, not stripped

Debug ta thấy trong main gọi 2 hàm chính là do_readleave.

do_read thì cho phép ta đọc giá trị tại địa chỉ bất kì do người dùng nhập vào.

hàm leave đọc 158 bytes từ người dùng rồi in ra và chính nó làm format luôn nên dẫn tới lỗi format string.

nhưng ngay sau đó thì call ngay hàm _exit.

 

Ta không có quyền ghi đè _exit GOT vì vậy phải exploit ngay trong hàm print

Debug ta thấy printf gọi tới vfprintf, vfprintf gọi tới buffered_vfprintf.

Trong buffered_vfprintf có đoạn mã sau:

Chương trình sẽ call [ecx+0x1c]ecx_IO_file_jumps trong libc.

vtable _IO_file_jumps nằm trong vùng nhớ không có quyền ghi (write).

Trace ngược lại ta thấy:

_IO_file_jumps nằm tại _IO_2_1_stdout_+0x94 mà vùng này ta có quyền ghi (write).

Hướng xử lý là ta sẽ đổi địa chỉ _IO_file_jumps và tạo 1 vtable fake mới để chương trình gọi tới system.

_IO_2_1_stdout_ ta sẽ đổi thành sh\x00\x00

 

Cụ thể như sau:

new_IO_file_jumps = _IO_2_1_stdout_+0x150

new_IO_file_jumps+0x1c = system

_IO_2_1_stdout_ = “sh\x00”
Vậy ta cần địa chỉ của _IO_2_1_stdout_system.

Các địa chỉ này ta sẽ có được bằng cách đọc giá trị tại địa chỉ bất kỳ trong hàm do_read.

Mình đọc địa chỉ của _IO_2_1_stdout_ từ 0x804a044 trong bss.

libc đề đã cho => tính được system.

Hiện tại server của 0ctf không còn kết nối được nữa nên mình chỉ exploit local thôi.

Full payload here.

Leave a Reply

Your email address will not be published. Required fields are marked *