[Programming] lập trình assembly cho linux |
19/08/2010 18:39:03 (+0700) | #1 | 218669 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
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,
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
|
|
|
|
[Programming] lập trình assembly cho linux |
19/08/2010 20:04:38 (+0700) | #2 | 218676 |
hmtaccess
Member
|
0 |
|
|
Joined: 12/06/2008 02:26:45
Messages: 197
Location: ™œžŸ¤¢£§¨©
Offline
|
|
Nhà bạn có máy sun để chạy à, ghê woa |
|
|
|
|
[Programming] lập trình assembly cho linux |
19/08/2010 20:26:05 (+0700) | #3 | 218677 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
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,
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
|
|
|
|
[Programming] lập trình assembly cho linux |
20/08/2010 19:01:19 (+0700) | #4 | 218755 |
Zknight
Member
|
0 |
|
|
Joined: 13/08/2010 14:42:48
Messages: 8
Offline
|
|
A Pan có thể viết 1 shellcode đơn giản để em coi học theo đc ko a |
|
|
|
|
[Programming] lập trình assembly cho linux |
20/08/2010 19:46:06 (+0700) | #5 | 218758 |
|
nhanth87
Member
|
0 |
|
|
Joined: 12/08/2009 08:54:00
Messages: 168
Offline
|
|
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 |
|
|
|
[Programming] lập trình assembly cho linux |
20/08/2010 22:51:22 (+0700) | #6 | 218775 |
|
H3x4
Member
|
0 |
|
|
Joined: 02/04/2009 00:03:16
Messages: 242
Offline
|
|
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 |
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 10:46:56 (+0700) | #7 | 218789 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
;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
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 11:11:37 (+0700) | #8 | 218790 |
alakay
Member
|
0 |
|
|
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
|
|
Code:
objcopy -O binary t shellcode
Câu lệnh này làm ở đây với mục đích gì vậy |
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 11:16:31 (+0700) | #9 | 218791 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
nó dùng để lấy mã binary trong định dạng elf |
|
[Unix] live free or die
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 11:25:09 (+0700) | #10 | 218792 |
alakay
Member
|
0 |
|
|
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
|
|
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. |
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 11:37:11 (+0700) | #11 | 218794 |
alakay
Member
|
0 |
|
|
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
|
|
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
|
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 12:01:23 (+0700) | #12 | 218795 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
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
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 16:17:28 (+0700) | #13 | 218805 |
alakay
Member
|
0 |
|
|
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
|
|
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
|
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 16:18:55 (+0700) | #14 | 218806 |
alakay
Member
|
0 |
|
|
Joined: 17/07/2010 11:13:54
Messages: 56
Offline
|
|
Ò mình hiểu rồi có phải âm 16 (-16)
gà quá |
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 20:28:29 (+0700) | #15 | 218819 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
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:
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
|
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 20:57:19 (+0700) | #16 | 218822 |
|
AIO
Member
|
0 |
|
|
Joined: 21/02/2008 23:44:02
Messages: 127
Offline
|
|
@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ả |
|
|
|
[Programming] lập trình assembly cho linux |
21/08/2010 21:06:17 (+0700) | #17 | 218823 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
ờ, 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
|
|
[Programming] lập trình assembly cho linux |
26/08/2010 20:52:12 (+0700) | #18 | 219218 |
nhantn9
Member
|
0 |
|
|
Joined: 24/07/2009 18:50:02
Messages: 18
Offline
|
|
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. . 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 |
|
|
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|
|
|