2012-03-21 15 views
10

मुझे पता है कि जीडीबी का उपयोग करके मेरे प्रोग्राम के असेंबली कोड को कैसे प्राप्त किया जाए, लेकिन मैं ऑपोड कैसे प्राप्त करूं? मुझे लिनक्स सर्वर हैक करने की आवश्यकता है (चिंता न करें कि यह एक वर्ग का हिस्सा है, इसलिए कोई वास्तविक सर्वर नुकसान नहीं पहुंचाएगा)। असल में मैं this लेख पढ़ रहा था और मैं सोच रहा हूँ मैं विधानसभा से कैसे प्राप्त कर सकते हैं:सी प्रोग्राम के ऑपकोड कैसे प्राप्त करें

[aleph1]$ gcc -o shellcodeasm -g -ggdb shellcodeasm.c 
[aleph1]$ gdb shellcodeasm 

(gdb) disassemble main 
Dump of assembler code for function main: 
0x8000130 <main>:  pushl %ebp 
0x8000131 <main+1>:  movl %esp,%ebp 
0x8000133 <main+3>:  jmp 0x800015f <main+47> 
0x8000135 <main+5>:  popl %esi 
0x8000136 <main+6>:  movl %esi,0x8(%esi) 
0x8000139 <main+9>:  movb $0x0,0x7(%esi) 
0x800013d <main+13>: movl $0x0,0xc(%esi) 
0x8000144 <main+20>: movl $0xb,%eax 
0x8000149 <main+25>: movl %esi,%ebx 
0x800014b <main+27>: leal 0x8(%esi),%ecx 
0x800014e <main+30>: leal 0xc(%esi),%edx 
0x8000151 <main+33>: int $0x80 
0x8000153 <main+35>: movl $0x1,%eax 
0x8000158 <main+40>: movl $0x0,%ebx 
0x800015d <main+45>: int $0x80 
0x800015f <main+47>: call 0x8000135 <main+5> 
0x8000164 <main+52>: das 
0x8000165 <main+53>: boundl 0x6e(%ecx),%ebp 
0x8000168 <main+56>: das 
0x8000169 <main+57>: jae 0x80001d3 <__new_exitfn+55> 
0x800016b <main+59>: addb %cl,0x55c35dec(%ecx) 
End of assembler dump. 

निम्नलिखित:

testsc.c 
------------------------------------------------------------------------------ 
char shellcode[] = 
    "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00" 
    "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80" 
    "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff" 
    "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3"; 

प्रणाली लिनक्स x86 और भाषा मैं सी मैं का उपयोग किया जाएगा है वास्तव में एक स्वचालित तरीके से पसंद है, लेकिन एक मैनुअल समाधान भी काम करेगा।

मेरा मतलब है कि मैं% ebp,% esi,% esp आदि कैसे परिवर्तित करूं .. क्या कोई नक्शा मैं उपयोग कर सकता हूं? या एक स्वचालित प्रोग्राम?

+0

क्या आप x86 डिस्सेबलर की तलाश में हैं? –

+0

मुझे लगता है कि डिस्सेबलर जो मैं कर रहा हूं उसके विपरीत करता है –

+0

x86 निर्देश सेट की एक सूची में मैपिंग है, इसका उपयोग 0xEB (जो 'जेएमपी' है) या इसके विपरीत (संयोजन, या " संकलन ", 'जेएमपी' से 0xEB आदि)। – tripleee

उत्तर

2

इसे मिला! सबसे पहले डिस्सेबल करें टाइप करें: एक्स/बीएक्स एंटर दबाएं और असेंबली कमांड के हेक्स प्रस्तुति को एक-एक करके प्राप्त करें!

+0

आप x/100bx start_address का उपयोग कर इसे एक साथ कर सकते हैं इससे आपको start_address से शुरू होने वाले अगले 100 बाइट्स का हेक्स प्रतिनिधित्व मिलेगा। अपने विघटित कोड फैलाने वाले बाइट्स की संख्या में 100 बदलें। – Anonymous

11

ये रहा:

Disassembly of section .data: 

00000000 <shellcode>: 
    0:  eb 2a     jmp 2c <shellcode+0x2c> 
    2:  5e      pop %esi 
    3:  89 76 08    mov %esi,0x8(%esi) 
    6:  c6 46 07 00    movb $0x0,0x7(%esi) 
    a:  c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi) 
    11:  b8 0b 00 00 00   mov $0xb,%eax 
    16:  89 f3     mov %esi,%ebx 
    18:  8d 4e 08    lea 0x8(%esi),%ecx 
    1b:  8d 56 0c    lea 0xc(%esi),%edx 
    1e:  cd 80     int $0x80 
    20:  b8 01 00 00 00   mov $0x1,%eax 
    25:  bb 00 00 00 00   mov $0x0,%ebx 
    2a:  cd 80     int $0x80 
    2c:  e8 d1 ff ff ff   call 2 <shellcode+0x2> 
    31:  2f      das 
    32:  62 69 6e    bound %ebp,0x6e(%ecx) 
    35:  2f      das 
    36:  73 68     jae a0 <shellcode+0xa0> 
    38:  00 89 ec 5d c3 00  add %cl,0xc35dec(%ecx) 

नोट कैसे पिछले 00 कि add %cl अनुदेश में स्ट्रिंग शून्य टर्मिनेटर बाइट से आता है, यह स्पष्ट नहीं है।

मैं कैसे मिला यह था कि मैं बस

gcc testsc.c -c 

के साथ अपने घोषणा संकलित और फिर

objdump -D testsc.o 
+0

मुझे लगता है कि यह मैं जो करना चाहता हूं उसके विपरीत है ... –

+0

ऐसा हो सकता है, लेकिन जवाब वही है।आप 'gcc' के अंदर ऐसा करने के बजाय 'objdump' का उपयोग करके' shellcodeasm' प्रोग्राम को अलग कर सकते हैं। जैसा कि आप देख सकते हैं, आउटपुट प्रारूप आपको डिस्सेप्लोर लिस्टिंग * और * ऑपकोड देता है। आप बाइट्स के कॉलम को काटने के लिए कुछ टेक्स्ट प्रोसेसिंग कर सकते हैं और स्वचालित रूप से उन्हें सी घोषणा में बदल सकते हैं। – Kaz

6

आप उपयोग कर सकते हैं:

gcc -S -c tst.c -o - 

या

gcc -g -ggdb -c tst.c 
objdump -S tst.o 
ऑपकोड के साथ अपने प्रोग्राम के डिस्सेप्लर प्राप्त करने के लिए

प्राप्त करने के लिए अपने चार सरणी के disassembly, तो आप उपयोग कर सकते हैं:

gcc -c tst.c 
objdump -D -j .data tst.o 
+0

क्या आप वाकई हैं? objdump डिफ़ॉल्ट रूप से डेटा अनुभाग को अलग नहीं करेगा और जीसीसी मनमाने ढंग से शाब्दिक तारों को opcodes में परिवर्तित नहीं करेगा। – zvrba

+0

@zvrba ने मेरा जवाब अपडेट किया, मैंने पहले नोटिस नहीं किया था कि वह सरणी बाइट्स के डिस्सेप्लर चाहता था। – ouah

+0

यदि objdump डिफ़ॉल्ट रूप से डेटा अनुभागों को अलग नहीं करेगा, तो मैंने उस उत्तर का उत्पादन कैसे किया? – Kaz

0

एक छोटे से विधानसभा फ़ाइल बनाएँ, code.s का कहना है।

.text 
.byte 0xeb, 0x2a, 0x5e, .. 

as code.s -o code.o के साथ असेंबल करें और परिणाम डिसअसेंबल करने objdump का उपयोग करें: उसके बाद निम्न अंदर डाल दिया।

संबंधित मुद्दे