BOF원정대 2012.11.18 21:03

[0x03] cobolt

int main()
{
    char buffer[16];
    gets(buffer);
    printf("%s\n", buffer);
}

gremlin과 완전히 같지만, argv로 payload를 넘기던 것과 달리, 여기선 프로그램 실행 후에 stdin(키보드)으로 입력을 받는다. 그런데 키보드로 표현할 수 있는 문자는 ASCII문자 뿐이다. 그렇다면 ASCII문자로만 payload를 구성해야 할까? 

물론 말이 안 된다. 0xbffffdc1, 즉 0xbf, 0xff, 0xfd, 0xc1을 어떻게 키보드로 칠 수 있겠는가. 결국엔 이 Non-ASCII 문자들을 stdin으로 전달해줘야 한다는 말이 된다. C언어에서 파일 입출력에 대해 배우면서 들은 말이 있을 것이다. File Descriptor라고. 



그리고 C언어 책을 주의깊게 봤다면, stdin은 File Descriptor #0이고, stdout은 #1인 것도 알 것이다(그림과 같이). 이 말이 무슨 뜻이냐면, 파일 입출력을 할 때 File Descriptor에 내용을 전달하는 것 처럼(밑의 예제를 보자), stdin에도 파일 입출력처럼 출력을 할 수 있다는 뜻이다(정확하게 말하자면, stdin도 파일 입출력과 다를 것이 없다).
/* example */
int main(){
	FILE *fp = fopen("aa.txt","w");
	
	/* File Descriptor fp(aa.txt) 에 출력 */
	fprintf(fp, "Hello, World!\n");
	
	/* File Descriptor stdout(모니터) 에 출력 */
	fprintf(stdout, "Hello, World!\n"); 
}

결국, 여담이지만, printf() = fprintf(stdout)이고 scanf() = fscanf(stdin) 이라고도 할 수 있는 것이다. 연결고리를 더 찾아보자면 fflush(stdin)(권장하지는 않는 함수지만) 도 마찬가지고. 

다시 본론으로 돌아가서, 그렇다면 stdin에 payload를 출력해주면 되므로 이를 위한 방법을 찾아본다면 이 문제가 해결될 것이다. 

Hint: pipe, cat, stdin

Payload


신고

'BOF원정대' 카테고리의 다른 글

[0x03] cobolt  (0) 2012.11.18
[0x02] gremlin  (0) 2012.11.18
[0x01] gate  (0) 2012.11.17
[0x00] 후기  (0) 2012.11.17
VMWare Fusion 5 에서의 부팅 문제  (0) 2012.08.29


티스토리 툴바