티스토리 뷰

Programming/Assembly

[Assembly 1] write, strlen, exit

err0rless313 2015. 10. 9. 11:30
# print_hello.s
.data # start data section
string:
.string "Hello, My First Assemly World!!\n"
.text # start text section
.global main
my_write:
push %ebp
mov %esp, %ebp
mov 0x08(%ebp), %ebx # fd
mov 0x0C(%ebp), %ecx # buf
mov 0x10(%ebp), %edx # count
mov $0x04, %eax # system call
int $0x80
leave
ret
my_exit:
push %ebp
mov %esp, %ebp
mov 0x08(%ebp), %ebx # status
mov $0x01, %eax # system call
int $0x80
strlen:
push %ebp
mov %esp, %ebp
mov 0x08(%ebp), %esi # string
mov $0x00, %ecx # counter
.loop:
movb (%esi), %al
cmpb $0x00, %al # null byte
je .final
inc %esi
inc %ecx
jmp .loop
.final:
mov %ecx, %eax # eax = count
leave
ret
main:
push %ebp
mov %esp, %ebp
push $string
call strlen
mov %eax, %edx
push %edx # count
push $string # buf
push $0x01 # fd
call my_write # call write
push $0x00 # status
call my_exit # call exit
leave
ret
view raw print_hello.s hosted with ❤ by GitHub



write, strlen, exit 구현해봄


당연히 처음 해보는 어셈블리 코딩이라서 cd80님 블로그 참고

http://cd80.tistory.com/27


cd80님은 printString으로 만드셧는데 나는 그냥 진짜 write함수처럼 만듦.

write는 아래와 같이 인자지정을 해주면 됨


int write(int fd, char *buf, int cnt);

int write(ebx, ecx, edx);


그리고 연습차 exit도 만들었음 exit는 인자 지정해주고(인자도 한개라서) 

eax를 system call로 지정만 해주면 돼서 굉장히 쉬웠음


void exit(int status)


strlen에서 loop처럼 .을 붙이면 라벨을 지정해 줘서 jmp가능


원래 리버싱도 잘 안하고 어셈블리 잘 몰라서 익스플로잇할때도 좀 힘든감이 있었는데 (진짜 필요한것만 알아두고..)

직접 프로그래밍 해보면서 익히면 나중에 진짜 가젯을 만들면서 ROP할 수 도 있을거 같다.



'Programming > Assembly' 카테고리의 다른 글

[Assembly 2] strncpy  (0) 2015.10.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함