2009-04-21 32 views
6

Là một bài tập cho lớp bảo mật, tôi đang cố gắng sử dụng __asm__("jmp 0xbffff994"); trong mã của mình, nhưng khi tôi tháo rời mọi thứ trong gdb, hướng dẫn được đổi thành jmp 0xc8047e2a. Bất kỳ ý tưởng nào và tại sao tôi có thể chuyển đến một địa chỉ cụ thể?x86 chuyển đến địa chỉ

+2

Tại sao bạn cần phải chuyển đến địa chỉ thô? Tôi đang có một thời gian khó hiểu bất kỳ việc sử dụng (không bất chính) có thể cho điều đó. – kquinn

+0

Bạn sử dụng hệ thống nào? –

+5

@kquinn bất kể câu hỏi của anh ta đã được hỏi, hãy cố gắng trả lời nó. – samoz

Trả lời

18

Có thể vì đó là một bước nhảy đến địa chỉ tương đối và trình liên kết hoặc trình tải đã di chuyển mã của bạn. Hãy thử đặt địa chỉ vào một biến, và sau đó làm:

jmp dword [var] 

hoặc cách khác:

push 0xbffff994 
ret 
+5

* rằng * là câu trả lời đúng, cũng lưu ý rằng: "mov eax, 0x11223344; jmp eax"; cũng sẽ hoạt động và có khả năng là một bước tiến nhất. –

+1

rất đúng, nhưng anh ta có thể đang sử dụng fastcall (tôi không chắc chắn về ý nghĩa của 0xbffff994). – Mark

+0

Kết hợp PUSH RET hoạt động! Cảm ơn bạn! – Martin

0

Daniel Giải thích lý do tại sao bước nhảy của bạn không giống với chương trình bạn đã lập trình. Nó phải làm với các tập tin đối tượng và liên kết.

nếu bạn muốn chuyển đến một địa chỉ cụ thể, tốt nhất bạn nên vá bước nhảy bằng Trình gỡ lỗi hoặc Bộ tách rời.

0

Trên hệ thống của tôi (gcc phiên bản 4.2.4, Ubuntu) điều này có vẻ tốt trên các disassmbley (cái nhìn sâu sắc) :

 
int main() 
{ 
asm("jmp 0xbffff994"); 
return 0; 
};  

kết quả của disassmbley (cái nhìn sâu sắc):

 
     0x8048344  :     lea 0x4(%esp),%ecx 
-  0x8048348  :    and $0xfffffff0,%esp 
-  0x804834b  :    pushl -0x4(%ecx) 
-  0x804834e  :    push %ebp 
-  0x804834f  :    mov %esp,%ebp 
-  0x8048351  :    push %ecx 
-  0x8048352  :    jmp 0xbffff994 
-  0x8048357  :    mov $0x0,%eax 
-  0x804835c  :    pop %ecx 
-  0x804835d  :    pop %ebp 
-  0x804835e  :    lea -0x4(%ecx),%esp 
-  0x8048361  :    ret 
+0

Tôi đoán rằng trình tách rời đó đang hiển thị độ lệch của jmp và không phải là mục tiêu thực tế của nó. (lệnh jmp có giá trị offset tương đối so với eip khi bạn cung cấp cho nó một toán hạng trực tiếp 32 bit). –

+0

Tại sao bạn đoán vậy? có cách nào để kiểm tra nó không? nó đang chạy như một giao diện đồ họa với GDB bên dưới. –

+0

Hoặc có thể là không có di dời. Tuy nhiên, nếu bạn đổ opcodes với assembly, bạn sẽ có thể thấy offset. – Mark

0

Thật khó để xác định địa chỉ chính xác khi biên dịch, bạn đã thử sử dụng nhãn chưa? Nó là phổ biến hơn nhiều để sử dụng chúng với jmp.

dụ:

start: 
jmp exit 

exit: 
ret 
0

tôi sẽ khuyên bạn sử dụng một trình soạn thảo hex và chỉ cần thay đổi giá trị nếu nó chỉ là một điều một lúc.

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