저번 글에 이어서 메모리에 쓰기를 어떤 포맷스트링을 사용하면 되는지 부터 공부해보겠습니다~
%n이라는 포맷스트링이 바로 메모리에 쓰기가 가능한 포맷스트링입니다.
#include<stdio.h>
int main() {
int val;
printf("blah %n blah\n",&val);
printf("val = %d\n",val);
return 0;
}
%n은 메모리에 쓰는 것이기 때문에 얘랑 짝꿍이 되어야 되는 것은 반드시 데이터가 쓰여질 메모리의 주소여야 합니다. 주소가 와야되기 때문에 &val은 val이라는 변수의 주소값이 온 것입니다. %n을 만나기 전까지 화면에 출력된 글자의 갯수를 val에 저장을 하란 의미입니다. 총 5글자입니다.(b,l,a,h,blank) 5라는 값이 val변수에 저장이 된다는 겁니다. 원래 val이라는 변수는 초기화가 되어 있지 않은 변수인데 %n이라는 포맷스트링을 이용해서 메모리에 쓰기가 이루어지게 되었고 val을 출력했을때 5라는 값이 나오게 됩니다.
#include<stdio.h>
void main(int argc,char *argv[]){
int i=0;
printf("최초 i의 값: %d\n",i);
printf("%s%n\n",argv[1],&i);
printf("변경된 i의 값: %d\n",i);
}
argv[0]에는 실행파일 이름이 들어가고, argv[1]에는 그 다음에 입력한 사용자 입력 문자열이 저장됩니다. argc에는 main에 전달된 인자의 개수가 저장됩니다.
위에 코드를 실행하면
./test AAAAAA
결과는 최초 i의 값: 10
AAAAAA
변경된 i의 값: 6
argv[1]를 %s로 출력을 하니까 AAAAAA출력을 하고 %n은 화면에 출력한 글자 수가 6이므로 i에는 6이라는 값이 들어갑니다.
'Computer Security' 카테고리의 다른 글
암호에 대한 이해 - 비대칭 암호 알고리즘 (0) | 2017.12.08 |
---|---|
암호에 대한 이해 - 대칭키 암호 알고리즘 (0) | 2017.12.08 |
코드 보안 - 포맷 스트링(1) (0) | 2017.12.05 |
암호를 이용한 전자상거래 - 전자 화폐 (0) | 2017.12.03 |
암호를 이용한 전자상거래 - 신용카드 결제 (0) | 2017.11.28 |