main 함수의 인자
-int main();
-int main( int argc, char *argv[ ] );
주소냐 메모리냐 구분만 잘해주면 된다.
#> ./a.out hello
hello
* 위 내용은 hello라는 인자를 받아서 그 인자의 내용인 hello를 출력하는 프로그램이다.
- 포인터 배열 사용
- 포인터 배열: 배열인데 주소를 원소로 하는
- 배열 포인터: 포인터인데 배열을 나타내는
* int argc 인자의 경우 argument의 갯수를 나타낸다.
* 실행 프로그램의 이름도 argument로 친다. ( 첫번째 인자 )
* char *argv[]의 시작 주소를 가져올때는 [ebp+12] 위치에서 가져온다.
먼저 C 언어로 확인해 보면
1).인자가 없는 경우
int main( int argc, char *argv[] )
{
printf("argc: %d\n", argc); // 인자의 개수, 최소는 arg1, null 이다
printf("argv: 0x%08x\n", argv); // argv의 주소
printf("*argv: 0x%08x\n", *argv); // 주소의 메모리 호출 거기에도 주소가 들어있음. [argv]
printf("*argv[]: %c\n", **argv); // 메모리의 첫번째 문자 [[argv]]
printf("*argv[]: %s\n", argv[0]); // 첫번째 인자의 메모리. 문자열을 출력한다
printf("%s\n", argv[1]); // 두번째 인자의 문자열을 호출
return 0;
}
어셈블리
extern printf
segment .data
prompt_hex db 'address:0x%08x',10,00
prompt_chr db 'memory: %c',10,00
prompt_int db 'argc: %d',10,00
segment .text
global main
main:
push ebp
mov ebp, esp
push dword [ebp+8]
push prompt_int
call printf
add esp, 8
mov eax, [ebp+12]
push eax
push prompt_hex
call printf
add esp, 8
mov eax, [ebp+12]
mov ebx, [eax]
push ebx
push prompt_hex
call printf
add esp, 8
mov eax, [ebp+12]
mov ebx, [eax]
mov ecx, [ebx]
push ecx
push prompt_chr
call printf
add esp, 8
xor eax, eax
leave
ret
문자를 넘겨줄때는 주소를 넘겨줘야 %s로 온전히 출력이 가능하다
push ebp
mov ebp, esp
push dword [ebp+8]
push prompt_int
call printf
add esp, 8
[ebp + 8] 에는 argc 값이 들어 있다.
따라서 printf 하면 argc 값이 들어가 있을것이다
mov eax, [ebp+12]
push eax
push prompt_hex
call printf
add esp, 8
[ebp+12] 에는 argv 의 주소 값이 들어가 있다
따라서 printf 하면 argv의 주소 값이 출력된다
mov eax, [ebp+12]
mov ebx, [eax]
push ebx
push prompt_hex
call printf
add esp, 8
[ebp+12] 에 한번더 [] 를 씌우면 그 주소가 나타내는 포인터 배열이 한번더 출력된다 그 값은 주소 값이다
mov eax, [ebp+12]
mov ebx, [eax]
mov ecx, [ebx]
push ecx
push prompt_chr
call printf
add esp, 8
[[[ebp+12]]] 이렇게 되면 이제 메모리 값이 출력된다
그 값은 인자의 첫번째 글자 일것이다.
'시스템 해킹' 카테고리의 다른 글
[시스템 해킹] GDB 디버거 사용법 (0) | 2018.01.27 |
---|---|
[시스템 해킹] 시스템 콜 (0) | 2018.01.27 |
[시스템 해킹] 배열 지역 변수로 구현하기 (0) | 2018.01.27 |
[시스템 해킹] 어셈블리 함수 표현 (Stack) (0) | 2018.01.23 |
[시스템 해킹] 어셈블리 반복문 (0) | 2018.01.18 |