banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix lập trình assembly cho linux  XML
  [Programming]   lập trình assembly cho linux 19/08/2010 18:39:03 (+0700) | #1 | 218669
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]
ngày hôm nay rãnh nên post bài về lập trình,
mình mới tìm hiểu xong, smilie
các bạn có tham khảo
có thể dịch ra shell code được, các bạn nào muốn mình viết shellcode thì mình có thể giúp
shellcode trên x86_64 dễ hơn do ít parameter ít pass qua stack hơn 32 bit
I-intro
trình biên dịch xài là gói binutils
cài trên Debian:
apt-get install binutils
II- hello world program
Lưu ý chuơng trình này chạy trên máy x86-64 bit
dùng uname -m để biết máy mình đang chạy mode nào
Code:
# hello.s
.data
  str:.string "hello world\n"
  len:
    .set LEN, len-str
.text
.globl _start
_start:
 ## write sys call
   mov $1,%rax
   mov $1,%rdi
   mov $str,%rsi
   mov $LEN,%rdx
   syscall
 # call exit
   mov $60,%rax
   xor %rdi,%rdi
   syscall

Makefile
Code:
all:
     as hl.s -o hl.o
     ld hl.o -o hl
clean:
     rm -f hl.o hl

Chương trình hl.s sau khi chạy sẽ in ra chuổi hello world.
Chương trình viết bằng assembly có thể gọi hàm thư viện nhưng ở đây goi system call trực tiếp.
Chúng ta gọi write và exit. Để hiểu được thì tuơng đuơng với mã lệnh C:
Code:
write(1,"hello world \n",0xe);
exit(0);

để gọi một system call giống write trên cần pass parameter theo calling convention theo thứ tự: rdi rsi rdx r10 r8 r9
rax chứa số system call number /usr/include/linux/unistd.h
tương tự có thể dùng nhiều system call khác và phát triển thêm ....
ví dụ chạy lệnh ls -lh / bằng assembly
Code:
#assembly example 
# as -o t.o t.s
# ld  -o t t.o
.data
  str:.string "hello world\n"
  sh:
	.asciz "/bin/bash"
  shopt:
	.asciz "./cmd"
	.asciz "-c"
	.asciz "ls -lh /"
	.byte 0x0
.bss
  .lcomm V, 32
.text
.globl _start, _execv, _exit
_execve:
	mov $59,%rax
	syscall
	retq
_exit:
	mov $59,%rax
	syscall
	retq
_start:
## exec
 mov $V,%rax
 movq $shopt,(%rax)
 movq $shopt+6,0x8(%rax)
 movq $shopt+9,0x10(%rax)
 movq $0,0x18(%rax)
 mov $sh,%rdi
 mov $V,%rsi
 mov $0,%rdx
 call _execve
## exit
 mov %rax,%rdi
call _exit

hình dạng một số system call:
Code:
long write(long fd,void *v,long lenght);
long read(long fd,void *v,long lenght);
long exit(long _status);
long execve(const char *name,char **argv,char **envp);

code goi libc function
Code:
/*tty.s*/
.text
.globl _start
_start:
  mov $1,%rdi
  call ttyname
  mov %rax,%rdi
  call puts
# exit
  mov $60,%rax
  mov $0,%rdx
  syscall

biên dịch
Code:
as tty.s -o tty.o
   ld --dynamic-linker /lib/ld-linux-x86-64.so.2 -lc tty.o -o tty

hy vọng các bạn enjoys
[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 19/08/2010 20:04:38 (+0700) | #2 | 218676
hmtaccess
Member

[Minus]    0    [Plus]
Joined: 12/06/2008 02:26:45
Messages: 197
Location: ™œžŸ¤¢£§¨©
Offline
[Profile] [PM]
Nhà bạn có máy sun để chạy à, ghê woa smilie
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 19/08/2010 20:26:05 (+0700) | #3 | 218677
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]

panfider wrote:
ngày hôm nay rãnh nên post bài về lập trình,
mình mới tìm hiểu xong, smilie
bài này giúp các bạn chưa biết assembly thì thử
I-intro
trình biên dịch xài là gói binutils
cài trên Debian:
apt-get install binutils
II- hello world program
Lưu ý chuơng trình này chạy trên máy x86-64 bit
dùng uname -m để biết máy mình đang chạy mode nào
Code:
# hello.s
.data
  str:.string "hello world\n"
  len:
    .set LEN, len-str
.text
.globl _start
_start:
 ## write sys call
   mov $1,%rax
   mov $1,%rdi
   mov $str,%rsi
   mov $LEN,%rdx
   syscall
 # call exit
   mov $60,%rax
   xor %rdi,%rdi
   syscall

Makefile
Code:
all:
     as hl.s -o hl.o
     ld hl.o -o hl
clean:
     rm -f hl.o hl

Chương trình hl.s sau khi chạy sẽ in ra chuổi hello world.
Chương trình viết bằng assembly có thể gọi hàm thư viện nhưng ở đây goi system call trực tiếp.
Chúng ta gọi write và exit. Để hiểu được thì tuơng đuơng với mã lệnh C:
Code:
write(1,"hello world \n",0xe);
exit(0);

để gọi một system call giống write trên cần pass parameter theo calling convention theo thứ tự: rdi rsi rdx r10 r8 r9
rax chứa số system call number /usr/include/linux/unistd.h
tương tự có thể dùng nhiều system call khác và phát triển thêm ....
ví dụ chạy lệnh ls -lh / bằng assembly
Code:
#assembly example 
# as -o t.o t.s
# ld  -o t t.o
.data
  str:.string "hello world\n"
  sh:
	.asciz "/bin/bash"
  shopt:
	.asciz "./cmd"
	.asciz "-c"
	.asciz "ls -lh /"
	.byte 0x0
.bss
  .lcomm V, 32
.text
.globl _start, _execv, _exit
_execve:
	mov $59,%rax
	syscall
	retq
_exit:
	mov $59,%rax
	syscall
	retq
_start:
## exec
 mov $V,%rax
 movq $shopt,(%rax)
 movq $shopt+6,0x8(%rax)
 movq $shopt+9,0x10(%rax)
 movq $0,0x18(%rax)
 mov $sh,%rdi
 mov $V,%rsi
 mov $0,%rdx
 call _execve
## exit
 mov %rax,%rdi
call _exit

hình dạng một số system call:
Code:
long write(long fd,void *v,long lenght);
long read(long fd,void *v,long lenght);
long exit(long _status);
long execve(const char *name,char **argv,char **envp);

code goi libc function
Code:
/*tty.s*/
.text
.globl _start
_start:
  mov $1,%rdi
  call ttyname
  mov %rax,%rdi
  call puts
# exit
  mov $60,%rax
  mov $0,%rdx
  syscall

biên dịch
Code:
as tty.s -o tty.o
   ld --dynamic-linker /lib/ld-linux-x86-64.so.2 -lc tty.o -o tty

hy vọng các bạn enjoys 
[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 20/08/2010 19:01:19 (+0700) | #4 | 218755
Zknight
Member

[Minus]    0    [Plus]
Joined: 13/08/2010 14:42:48
Messages: 8
Offline
[Profile] [PM]
A Pan có thể viết 1 shellcode đơn giản để em coi học theo đc ko a
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 20/08/2010 19:46:06 (+0700) | #5 | 218758
[Avatar]
nhanth87
Member

[Minus]    0    [Plus]
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
[Profile] [PM]
Nói chung là các sách lập trình linux không khuyến khích viết ct bằng assembly mà nên dùng C. Bởi vì C là ngôn ngữ dùng để viết ra Linux.
Aricent - Software Engineer
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 20/08/2010 22:51:22 (+0700) | #6 | 218775
[Avatar]
H3x4
Member

[Minus]    0    [Plus]
Joined: 02/04/2009 00:03:16
Messages: 242
Offline
[Profile] [PM]

Zknight wrote:
A Pan có thể viết 1 shellcode đơn giản để em coi học theo đc ko a 

xor eax,eax
push eax
push 0x65656565
mov ebx,esp
push eax
push ebx
mov ecx,esp
xor edx,edx
mov al,0xb
int 0x80

Shellcode ="\x31\xc0\x50\x68\x65\x65\x65\x65\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"

Bạn thử trả lời xem shellcode này làm gì :-P
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 10:46:56 (+0700) | #7 | 218789
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]
;cái này hơi stuff, nhưng xài intel syntax nên dễ hiểu hơn

nó in ra chuỗi /bin/sh
chạy x86_64 bit
nasm -f elf64 t.asm -o t.o
ld t.o -o t
Code:
section .text
global _start, write
write:
  mov al,1 ;write syscall
  syscall
  ret
_start:
  mov rax,0x68732f6e69622f
  push rax
  xor rax,rax
  mov rsi,rsp
  mov rdi,1
  mov rdx,7
  call write

exit:
  mov rbx,rax
  mov eax,1
  int 0x80

chạy shell
Code:
section .text
global _start
_start:
 mov rax,0x68732f6e69622f
 push rax
 mov rdi,rsp
 xor rsi,rsi
 xor rdx,0
 mov rax,59
 syscall

exit:
  mov rbx,rax
  mov eax,59
  syscall

Code:
nasm -f elf64 t.asm -o t.o
 ld t.o -o t
 objcopy -O binary t shellcode

shellcode chỉ có 49 bytes
mình sẽ cố thử viết C code có thể inject code này xem
=====vấn đề bảo mật====
giả sử có một daemon có lỗi cho phép ta inject code vào một hàm,
dĩ nhiên ta không cố ý để server down là làm cho nó segment fault, ta inject code sau cho :
+nó chạy tiếp code mà ta inject và tiếp tục return được về server mà y như không có chuyện gì xảy ra
+ chắc cái này đòi hỏi kĩ thuật self-modify trong mã inject
vấn đề cần tìm hiểu:
ta cần viết mã gì để mở một cổng, hay cho phép remote một shell từ xa
PS: nếu không có nasm thì apt-get install nasm
[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 11:11:37 (+0700) | #8 | 218790
alakay
Member

[Minus]    0    [Plus]
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
[Profile] [PM]
Code:
objcopy -O binary t shellcode


Câu lệnh này làm ở đây với mục đích gì vậy
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 11:16:31 (+0700) | #9 | 218791
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]
nó dùng để lấy mã binary trong định dạng elf
[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 11:25:09 (+0700) | #10 | 218792
alakay
Member

[Minus]    0    [Plus]
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
[Profile] [PM]

panfider wrote:
nó dùng để lấy mã binary trong định dạng elf 


Ý mình là trong trừong hợp này, có cần dùng nó không hay chỉ làm chơi. smilie smilie
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 11:37:11 (+0700) | #11 | 218794
alakay
Member

[Minus]    0    [Plus]
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
[Profile] [PM]
Code:
.file   "example1.c"
        .section .text
.globl _main
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        subl    %eax, %esp


andl $-16, %esp
Cái dòng này nó làm gì thế vậy, anh em giải thích được không
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 12:01:23 (+0700) | #12 | 218795
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]
andl $-16,%esp <=> dùng để xoá bit
-16 = 0xffffff0 nên nó xoá 4 bit cuối của esp
mình có tìm ra tài liệu về assembly của cả Intel syntax và ATT
http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html
khá good để bắt đầu với assembly
PS: ta cần viết mã gì để mở một cổng, hay cho phép remote một shell từ xa
[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 16:17:28 (+0700) | #13 | 218805
alakay
Member

[Minus]    0    [Plus]
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
[Profile] [PM]
Cú pháp của AT&T khó hiểu quá, ai có thể giúp về cú pháp này không
Tại sao phải là: $-16,%esp
Mà không phải: $ 16, %esp

smilie smilie smilie
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 16:18:55 (+0700) | #14 | 218806
alakay
Member

[Minus]    0    [Plus]
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
[Profile] [PM]
Ò mình hiểu rồi có phải âm 16 (-16)

smilie gà quá smilie
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 20:28:29 (+0700) | #15 | 218819
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]
andl $-16, %esp
dịch:
81 e4 ff ff ff f0
hoặc:
83 e4 f0
nếu 16: sẽ xoá tất cả các bit bên trên, điều này khá vô lý
cái này do encode số thôi, thường do số âm và dương (2's complement)
công thức: muốn chuyển một số duơng thành âm, ta đảo bit sau đó cộng cho 1 thì đó là âm
ví dụ: thanh ghi 8 bit
16h = 0001 0000 b
đảo = 1110 1111
+1 = 1111 0000 = f0
và opcode : 81 e4 f0
disassembly: andl $0xff ff ff f0,%esp
mà phép toán and có tác dụng xoá bit theo pattern, tức -16 là mẫu, nghĩa là 4 bit cuối bị xoá

chỉ có vấn đề nữa là stack mà thôi
cái này hơi khó, vì nó đôi khi không gọi trực tiếp syscall mà pass địa chỉ stack
syscall tránh được, còn int $0x80 không được
hình như stack trong Linux chạy từ địa chỉ cao đến thấp
cho nên bạn tạo biến trong hàm _main bằng cách
Code:
subl $8,%esp

hàm có dạng
Code:
_test:
   push %ebp
   movl  %esp,%ebp
   subl  $0x4,%ebp      /*tạo biến nội*/
   movl $0x7f,(%ebp)  /*khởi tạo giá trị cho biến nội*/
   pop %ebp
   ret

tham số theo thứ tự nếu có frame pointer
tham số thứ nhất: 0x8(%ebp)
tham số thứ 2 0xc(%ebp)
nếu không xài frame pointer:
(%esp) địa chỉ trả về (hack nó)
0x4(%esp) parameter 1 ...
tham số 4 byte(x86_32) dùng cho kiểu int, con trỏ 4 byte
máy 32 bit không bao giờ hơn được 2^32(4GB) bộ nhớ nên con trỏ có thể trỏ tới bất kì nơi nào trong bộ nhớ

[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 20:57:19 (+0700) | #16 | 218822
[Avatar]
AIO
Member

[Minus]    0    [Plus]
Joined: 21/02/2008 23:44:02
Messages: 127
Offline
[Profile] [PM]
@panfider: như là bác đang dạy những người chưa biết về assembly trên linux thì phải ?
chẳng ai nghĩ gì về mình cả
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 21/08/2010 21:06:17 (+0700) | #17 | 218823
[Avatar]
panfider
Member

[Minus]    0    [Plus]
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
[Profile] [PM] [Email]
ờ, mình sẽ cố đưa ra mã shell code để hack,nhưng tạm thời mình không biết cách nào
nói chung là phải có cách hack được,
nhưng bạn phải nói được là shellcode sẽ làm gì thì mình mới biết cách
[Unix] live free or die
[Up] [Print Copy]
  [Programming]   lập trình assembly cho linux 26/08/2010 20:52:12 (+0700) | #18 | 219218
nhantn9
Member

[Minus]    0    [Plus]
Joined: 24/07/2009 18:50:02
Messages: 18
Offline
[Profile] [PM]
Wa, bác panfider này giỏi quá, chắc là 1 tay cừ khôi đây. Bác ở đâu vậy, nếu ở TP.HCM bữa nào e mời bác uống cafe xin được diện kiến dung nhan với. Ủa code này để hack được hả bác, mà bây giờ ai cũng dùng red hat, có bản quyền, quyền root cực kỳ bảo mật, học cái này không bit dùng vào đâu. smilie . Bác có cách nào chỉ e code sao mà get được quyền root trong red hat không? chỉ e với
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|