본문 바로가기

High Level Technique/Shellcoding

출력과 입력

출력과 입력


C언어에서는 출력과 입력을 할 때 printf와 scanf를 많이 사용합니다. 간결한 소스코드를 작성할 수 있죠.

ASM에서도 출력과 입력을 할 수 있습니다.



먼저 간단히 C언어 소스코드를 보고 ASM으로 바꿔보도록 하겠습니다.









IA-32





HelloWorld 소스코드를 분석 할때 출력에 대한 부분은 설명했으니 출력부분인 5~9, 17~21, 23~27과 종료부분인 29~31은 제외하고 값이 들어가는 부분에 대해서 설명하도록 하겠습니다.


입력을 받는 부분은 11~15줄에서 실행됩니다.

11 : eax에 3을 저장합니다. read()를 부르기 위한 것 입니다.

12 : ebx에 2를 저장합니다.

13 : ecx에 num을 저장합니다.

14 : edx에 5를 저장합니다.

15 : 커널에 정보를 넘겨줍니다.


새로운 section인 .bss section이 있습니다. num resb 5 라는 말은 5byte 공간을 확보해 둔다. 라는 의미 입니다.





IA-64





64비트도 마찬가지로 레지스터와 System Call의 숫자만 바뀌었을 뿐 달라진 것은 없습니다.







값은 어떻게 넣는 것인가?


각 함수의 인자 값을 알고 넣어야 하는데 어떤 값을 넣어야 하는지 의문이다.

들어가는 인자 값을 확인하는 방법은 man 명령어를 사용하는 것이다.




read에 관한 내용을 보려면 위와 같은 명령어를 입력하면 된다.

그러면 아래와 같이 매뉴얼이 나오게 된다.



'High Level Technique > Shellcoding' 카테고리의 다른 글

GDB 사용법  (0) 2016.03.11
Section  (0) 2016.03.11
System Call  (0) 2016.03.11
Hello World  (0) 2016.03.11
IA-32, IA-64 Register  (0) 2016.03.11