Đăng trong Pwnable.tw

[Pwnable.tw] – orw

Challenge

Screenshot from 2019-04-03 22-50-55

file orw

Screenshot from 2019-04-03 22-52-02.png

checksec

Screenshot from 2019-04-03 23-30-50

run binary

Screenshot from 2019-04-03 22-54-40.png

r2

Screenshot from 2019-04-03 22-53-33.png

 


Analysis

Ở bài này, chương trình yêu cầu ta nhập vào shellcode, sau đó tại lệnh 0x08048585 -> 0x0804858a, chương trình thực thi shellcode của ta bằng lệnh lời gọi call. Theo như yêu cầu đề bài, chỉ được dùng các lời gọi hàm open, read, write. Vậy ta sẽ viết shellcode đề open file ‘/home/orw/flag’, read nội dung file, rồi write ra màn hình. Tóm lại bài này chỉ là kĩ năng viết code asm thôi.

Tham khảo: syscall, syscall2. Ở đây chúng ta sẽ dùng lần lượt ba lời gọi hàm:

sys_open():

  • eax = 0x5
  • ebx: filename. Ta sẽ push tên file vào stack và gán ebx = esp
  • ecx: access mode: read-only (0), write-only (1), read-write (2). Ta chỉ cần đọc file nên ecx = 0 là đủ
  • edx: file permission. Ta không cần quan tâm, cho edx = 0
  • sys_open() sẽ trả về file desciptor, lưu vào thanh ghi eax.

sys_read():

  • eax = 0x3
  • ebx: file descriptor của file cần mở. Chính là giá trị trả về từ hàm sys_open() bên trên đã được lưu vào thanh ghi eax. Nên ebx = eax
  • ecx: con trỏ trỏ đến thanh ghi chứa chuỗi đọc được. Ta chọn bừa 1 thanh ghi nào đó: ecx = esi
  • edx: số byte đọc từ file. Cứ việc cho edx lớn: edx = 0x100
  • sys_write() sẽ trả về số kí tự thật sự được đọc, lưu vào thanh ghi eax

sys_write():

  • eax = 0x4
  • ebx: file descriptor. Ta cần ghi ra màn hình nên ebx = 0x1 (fd của stdout)
  • ecx: con trỏ trỏ đến thanh ghi chứa chuỗi cần ghi. Lúc nãy ta đã lưu vào thanh ghi esi vậy nên ecx = esi
  • edx: số byte cần ghi. Chính là giá trị trả về của sys_read(). edx = eax
  • sys_write() sẽ trả về số kí tự thật sự được ghi.

 


Code

Screenshot from 2019-04-03 23-23-58.png

Exploit

Screenshot from 2019-04-04 22-05-22

Bình luận về bài viết này