2013-06-06 58 views
14

Tôi thực sự đang cố gắng hiểu các bước từ mã mức cao -> có thể thực thi .. nhưng có một số khó khăn.Điều gì đang xảy ra trong __libc_start_main?

Tôi đã viết một tệp rỗng int main() {} C và đang cố gắng giải mã việc tháo gỡ qua objdump -d. Đây là những gì đang xảy ra:

  • trong _start, thiết lập sự liên kết, đẩy lập luận trên stack, gọi __libc_start_main
  • trong __libc_start_main, dòng đầu tiên để thực hiện là jmp *0x8049658

Tuy nhiên, khi sử dụng objdump -R để kiểm tra các bản ghi di dời, giá trị trong số 0x8049658__libc_start_main chính nó!

Tôi đang thiếu thứ gì đó ở đây ..

chỉnh sửa: đây là một số nguồn;

080482c0 <[email protected]>: 
80482c0:  ff 25 58 96 04 08  jmp *0x8049658 
80482c6:  68 08 00 00 00   push $0x8 
80482cb:  e9 d0 ff ff ff   jmp 80482a0 <_init+0x2c> 

Disassembly of section .text: 

080482d0 <_start>: 
80482d0:  31 ed     xor %ebp,%ebp 
80482d2:  5e      pop %esi 
80482d3:  89 e1     mov %esp,%ecx 
80482d5:  83 e4 f0    and $0xfffffff0,%esp 
80482d8:  50      push %eax 
80482d9:  54      push %esp 
80482da:  52      push %edx 
80482db:  68 50 84 04 08   push $0x8048450 
80482e0:  68 e0 83 04 08   push $0x80483e0 
80482e5:  51      push %ecx 
80482e6:  56      push %esi 
80482e7:  68 d0 83 04 08   push $0x80483d0 
80482ec:  e8 cf ff ff ff   call 80482c0 <[email protected]> 
80482f1:  f4      hlt 
80482f2:  66 90     xchg %ax,%ax 



DYNAMIC RELOCATION RECORDS 
OFFSET TYPE    VALUE 
08049644 R_386_GLOB_DAT __gmon_start__ 
08049654 R_386_JUMP_SLOT __gmon_start__ 
08049658 R_386_JUMP_SLOT __libc_start_main 
+0

Ngoài ra, bạn có thể đăng mã lắp ráp đầy đủ mà bạn đang tham chiếu không? Nó sẽ làm cho cuộc sống của chúng ta dễ dàng hơn nhiều. –

+1

Điều gì sẽ xảy ra nếu bạn bước qua hội đồng với một trình gỡ lỗi? Có thể là liên kết động ghi đè lên giá trị tại vị trí bộ nhớ 0x8049658, do đó, vào thời điểm chương trình nhận được lệnh 'jmp * 0x8049658', nó nhảy tới bất kỳ giá trị nào đã được viết ở đó khi chạy. –

+0

@AdamRosenfield Tôi không phải là 100% làm thế nào để làm điều đó. Tôi biết làm thế nào để thiết lập gdb lên để bước qua mã C của tôi, nhưng không biết làm thế nào để làm điều đó cho lắp ráp: S – gone

Trả lời

8

Khối đầu tiên, kết thúc bằng "@plt", là thủ tục liên kết bảng (https://stackoverflow.com/a/5469334/994153). jmp *0x8049658 là một hướng dẫn chi nhánh gián tiếp, do đó, nó thực sự là nhảy đến __libc_start_main bất cứ nơi nào nó thực sự kết thúc lên nhận được nạp trong RAM khi chạy.

Địa chỉ RAM thực của __libc_start_main được tìm thấy trong bảng RECOCIC RELOCATION RECORDS, được tạo trong RAM bởi trình nạp động khi chương trình được tải.

+0

Nó thực sự được giải quyết trong lần gọi đầu tiên trong những ngày này, bài đăng trên blog này cho thấy cách người xem có thể xem trình liên kết động hoạt động tại thời gian chạy http: //dustin.schultz. io/how-is-glibc-loaded-at-runtime.html – falstaff

+0

^Điều này được gọi là "tải chậm" cho những người tìm kiếm theo từ khóa. – sherrellbc

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