Thứ Ba, 20 tháng 9, 2016

[writeup][CSAW16][pwn200] Tutorial


Lần đầu làm giải CSAW này. Chỉ solve được vài bài, pwn thì chỉ làm đc warmup với tutorial. Bài warmup dễ nên nên lười viết. Bài này khó (so với noob như mình) nên viết, để năm sau có khá hơn đọc lại còn có cái mà tự cười vào mặt ...

File :https://drive.google.com/drive/folders/0B-QPcxnExPUcbmZ2cXBKcFVVQjQ?usp=sharing

Kiểm tra file









Hàm main thì chủ yếu là phần kết nối với socket này nọ, không liên quan đến ctrinh chính và được setup ở trên server sẵn nên mình không tập trung vào đây.
Sau khi kết nối xong này nọ, nó sẽ gọi hàm menu

















Hàm này sẽ cho ta truyền vào một số. Nếu số 1 thì gọi func1, số 2 gọi func2, số 3 thì exit. Trong đây không có lỗi gì nên sẽ xem tiếp func1...













Hàm func1 cũng không có lỗi gì. Tuy nhiên, ta có thể chú ý đến hàm dlsym. Sau khi lấy địa chỉ của hàm puts trong, nó sẽ trừ đi 1280 sau đó in ra. Qua cái này ta có thể leak được địa chỉ của puts. sau đó thông qua libc đề cho tính đc base libc.


Xem tiếp hàm func2...











Nhìn qua cũng thấy chỗ này là có lỗi rồi . Stack của hàm có 0x144=324bytes tuy nhiên hàm read lại cho phép đọc 460 bytes. Ngoài ra hàm write còn in ra 324 bytes từ s. Mà từ s đến v3 khoảng cách là 0x140-0x8 = 312. Vậy nó sẽ in ra cả v3, nhưng thiếu 2 bytes cuối. Sau quá trình debug thì ta thấy 2 bytes cuối là 0 nên ta sẽ thêm vào sau. Như vậy là ta sẽ leak đc v3 và bypass stack cookies.

Như vậy có thể hình dung được stack của func2 như sau :

rbp + 0x8:  ret (3)
...
rbp - 0x8: v3 (2)
...
...
rbp - 0x140: s (1)

Vậy cách làm là sẽ overflow buffer(s) sau đó ghi cookie (v3) vào đúng vị trí và ghi đè ret để chạy system("/bin/sh")
(1)  ---> (2) Ta overflow s
Tại (2) ta sẽ đè giá trị ban đầu của v3 mà đã leak đc
(3) ---> ghi đè system và /bin/sh.
Từ cái leak puts của func1. Ta tính toán các offset của system và /bin/sh trong libc đã cho :
base = puts - 0x06fd60 +1280
system=0x046590+base
binsh=0x17c8c3+base
Bên cạnh đúng cũng tìm ropgadget để có thể truyền arg cho system

$ ROPgadget --binary tutorial | grep "pop rdi"
0x00000000004012e3 : pop rdi ; ret

payload sẽ là

pl+='A'*312
pl+=p64(cookie)
pl+='\x90'*8
pl+=p64(pop_rdi)
pl+=p64(binsh)
pl+=p64(system)

Tuy nhiên cái này chạy trên server thì được, nhưng chạy trên client thì k đc. Thế nên mình dùng dup2 (Cái này nhờ anh phieulang mới biết). Ta sẽ dùng 2 hàm dup2(4,0) + dup2(4,1). Và cũng tính toán offset lấy hàm dup2 từ libc.
Tìm thêm 1 ropgadget nữa để truyền arg cho 2 hàm

$ ROPgadget --binary tutorial | grep "pop rsi"
0x00000000004012e1 : pop rsi ; pop r15 ; ret

code exploit : http://bugs.vn/4995

















Lần đầu thì bao giờ cũng sung sướng nhất :)). Cảm ơn anh phieulang và lacloi đã giúp em bài này :D.
GLHF!







Không có nhận xét nào:

Đăng nhận xét