2012-06-19 29 views
5

tôi đang trải qua một bài báo here và đã cố gắng ra đoạn mã tôi đã sao chép dưới đây: -(ORIG_EAX * 4) trong ptrace gọi

#include <sys/ptrace.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <linux/user.h> /* For constants 
            ORIG_EAX etc */ 
int main() 
{ pid_t child; 
    long orig_eax; 
    child = fork(); 
    if(child == 0) { 
     ptrace(PTRACE_TRACEME, 0, NULL, NULL); 
     execl("/bin/ls", "ls", NULL); 
    } 
    else { 
     wait(NULL); 
     orig_eax = ptrace(PTRACE_PEEKUSER, 
          child, 4 * ORIG_EAX, 
          NULL); 
     printf("The child made a " 
       "system call %ld\n", orig_eax); 
     ptrace(PTRACE_CONT, child, NULL, NULL); 
    } 
    return 0; 
} 

Tôi có một nghi ngờ về những gì ORIG_EAX là chính xác và tại sao 4*ORIG_EAX được chuyển vào cuộc gọi ptrace. Ban đầu, tôi giả định rằng ORIG_EAX, EBX, ECX v.v ... sẽ là số bù vào một cấu trúc cụ thể nơi các giá trị của thanh ghi sẽ được lưu trữ.

Vì vậy, tôi quyết định in giá trị của ORIG_EAX ngay sau khi chờ bằng cách sử dụng printf("origeax = %ld\n", ORIG_EAX);. Giá trị là 11. Vì vậy, giả định trước đây của tôi về việc bù đắp là sai.

Tôi hiểu rằng cuộc gọi wait bị chấm dứt khi trẻ có thay đổi trạng thái (trong trường hợp này, phát ra cuộc gọi hệ thống) và rằng ORIG_EAX sẽ chứa số cuộc gọi hệ thống.

Tuy nhiên, tại sao ORIG_EAX * 4 được chuyển vào cuộc gọi ptrace?

Trả lời

8

Thông số này được bù vào user_regs_struct. Lưu ý rằng mỗi cái trong số này là unsigned long, do đó, để có được mục nhập thứ 11 (orig_eax), độ lệch theo byte là 44, (miễn là bạn đang sử dụng máy x86).

+1

Điều gì về các khoảng trống giữa 32 và 64 bit? Chúng ta không nên biên dịch thời gian cho điều đó sao? –

+0

Hơn nữa ..., đây là ptrace x86 chỉ? Nếu không, chúng ta cần một số cách độc lập về mục tiêu chung hơn để làm điều này! –

+0

Chắc chắn là một định nghĩa cho một AMD64 'user_regs_struct', nhưng tôi không chắc chắn nếu bạn có thể trộn và kết hợp các kiến ​​trúc. IIRC các chú thích trong 'ptrace' đã đề cập đến các tiêu đề riêng biệt là một vấn đề. Vì 'ptrace' là một syscall nên nó hoạt động (bạn chỉ có thể phải chuyển đổi offsets cho mỗi kiến ​​trúc theo cách thủ công) nhưng tôi không thể nói rằng tôi đã từng thử nó. –

Các vấn đề liên quan