2012-04-27 29 views
10

gdb cung cấp chức năng để đọc hoặc viết thư cho một cụ thể địa chỉ tuyến tính, ví dụ:Cách sử dụng địa chỉ logic trong gdb?

(gdb) x/1wx 0x080483e4 
0x80483e4 <main>:  0x83e58955 
(gdb) 

nhưng làm thế nào để bạn xác định một địa chỉ logic? Tôi đến accross các hướng dẫn sau đây:

0x0804841a <+6>:  mov %gs:0x14,%eax 

làm thế nào tôi có thể đọc bộ nhớ tại "% gs: 0x14" trong gdb, hoặc dịch địa chỉ logic này đến một địa chỉ tuyến tính mà tôi có thể sử dụng trong x lệnh?

lưu ý: tôi biết rằng tôi chỉ đơn giản là có thể đọc% eax sau khi hướng dẫn này, nhưng đó không phải là mối quan tâm của tôi

+0

bản sao có thể có của [cách phân giải phân đoạn: quảng cáo bù trừ trong GDB] (http://stackoverflow.com/questions/4006686/how-to-resolve-segmentoffset-adres-in-gdb). Điều đó không có một câu trả lời tốt mặc dù. – Job

Trả lời

4

làm thế nào tôi có thể đọc bộ nhớ tại "% gs: 0x14" trong gdb

Bạn không thể: không có cách nào để GDB biết cách phân đoạn mà %gs đề cập đến đã được thiết lập.

hoặc dịch địa chỉ logic này đến một địa chỉ tuyến tính mà tôi có thể sử dụng trong x lệnh

Một lần nữa, bạn không thể làm được điều này nói chung. Tuy nhiên, bạn dường như đang ở trên Linux 32 bit x86 và ở đó bạn có thể làm điều đó - %gs được thiết lập để trỏ đến trình mô tả chuỗi thông qua set_thread_area cuộc gọi hệ thống.

Bạn có thể làm catch syscall set_thread_area trong GDB và kiểm tra các tham số (mỗi chuỗi sẽ có một cuộc gọi như vậy). Mã để thực sự làm điều đó là here. Khi bạn biết cách %gs đã được thiết lập, chỉ cần thêm 0x14 vào base_addr và bạn đã hoàn tất.

+0

Câu trả lời hay. Thật không may, chương trình của tôi dường như không gọi set_thread_area (2). Bạn có thể xem mã nguồn ở đây: http://pastebin.com/us5sbzVg (tùy chọn biên dịch được cung cấp trong mã nguồn). – user368507

+1

@ user368507 Chương trình của bạn chỉ có một chuỗi. Chương trình * không * gọi 'set_thread_area' (bạn sẽ có thể thấy rằng dưới' strace'). Tôi đã có thể bắt được cuộc gọi đó với GDB; không chắc chắn lý do tại sao bạn tuyên bố rằng 'set_thread_area' không được gọi. –

+0

lỗi của tôi. Tôi đã sử dụng một máy tính khác sau OP. Đó là một x86-64 ... Bạn anwser hoạt động hoàn toàn tốt trên 32bit x86. Tôi đoán mọi thứ khác nhau trên x86-64. – user368507

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