티스토리 뷰
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
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 |
---|
댓글