본문 바로가기
Computer Security

코드 보안 - 포맷 스트링(2)

by Doromi 2017. 12. 6.
728x90
반응형

저번 글에 이어서 메모리에 쓰기를 어떤 포맷스트링을 사용하면 되는지 부터 공부해보겠습니다~

%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이라는 값이 들어갑니다.

 

 

728x90
반응형