본문 바로가기

프로그래밍/C

(13)
scanf가 씹히는 경우 레드벨벳 조이 C언어로 코딩을 하는 경우 무한루프 ( while (1), for (;;) ) 안에서 scanf() 함수를 호출하여 값을 연속적으로 받고 연산을 하는 경우가 많다. 근데 이 경우에 scanf()가 씹히는 경우가 빈번히 생기는데, 이 때의 해결법을 써보도록하겠다. scanf()가 씹히는 경우는 버퍼에 사용자가 입력한 것이 남아있기 때문이다. %c를 받는 경우엔 \n (0x0a) 도 버퍼에 들어가기 때문에 scanf() 함수에서는 다음 루프를 돌 때 입력받은 값이 \n (0x0a) 된다. 이 경우에는 내가 생각한 두 가지의 해결책으로 해결할 수 있다. 1. scanf() 함수 뒤 getchar() 함수를 사용한다. - scanf() 함수 뒤 getchar() 함수를 사용하면 scanf()를 호..
후배가 질문해서 답하는 글 : 스트림은 왜 쓰는 건가요? 스트림을 사용하는 이유는 당연히 '효율성을 위해서'이다. 한 번 예를 들어보겠다. 당신은 농부이다. 땅을 파고 있다. 땅을 판 후, 흙을 강 건너의 창고에 두어야 한다. 그럼 당신은 삽으로 한 번 파고 그 걸 들고 가서 창고에 넣을 것인가 아니면,수레를 하나 옆에 두고 샆으로 그것을 계속 쌓아둔 후 창고에 한꺼번에 넣을 것인가? 효율성의 문제이다.
pwnable vulnerable functions 포너블에서는 해당 프로그램이 어떤 취약점을 갖고 있는지 빠르게 확인하는 것이 중요하다. 그것이 해당 문제를 얼마나 빨리 푸냐에 직결되기도 하니까. 그래서 C언어에서 공격에 취약한 함수들을 정리해보려고 한다. gets() gets 함수는 가장 대표적으로 가장 취약하다고 판단되는 함수이다. 해당 함수가 취약한 이유는 값을 얼만큼 받을지 정할 수 있는 장치가 아무것도 없기 때문이다. 만약 char buffer[40]인데 gets(buffer)로 받는 값을 크기가 100bytes 면 다른 변수들을 overwrite 할 수 있기 때문에 취약하다. strcpy() strcpy는 한 버퍼에 있는 값을 다른 버퍼로 보내는 함수이다. 이 함수도 말할 것도 없이 취약하다. 길이 제한을 할 수 없으니, 당연히 위험하다. L..
Linux 의 ELF 실행 과정 이 글은 해당 글을 보고 난 뒤 정리하는 글입니다.
파도파도 끝이 없는 bss에 대하여 예전에 bss 영역에 대해서 정리한 포스트와는 다르게, 오늘 bss에 대해서 새롭게 알게 된 사실이 있어서 여기에 적어보도록 하겠다.. ( 해당 포스트에서는 bss 영역이 초기화되지 않은 전역변수를 갖고 있지 않아도 규칙적으로 4bytes 를 갖는 것에 의문이 들어 정리한 글이다. ) 초기화되지 않은 전역변수가 없을 경우에도 bss section은 4 bytes의 크기를 갖게 되는데, 이 때 들어가는 값은 0x00000000 이다. gdb로 값을 보면, 이렇게 표현되어 있는데 아무리 구글링을 해도 나오지가 않는다. (예제로 사용한 코드는 "Hello world"를 출력하는 단순한 프로그램이었다.) 그냥 bss 영역이 "나 여기 있어요!!"라고 소리치는 값으로 생각하면 될 것 같다. bss의 숨겨진 값....
random number generation without random(), /dev/urandom 그냥 멍때리다가 생각났다. random(), /dev/urandom 없이도 랜덤값을 생성할 수 없을까? ASLR 이 생각나서 급하게 코딩해보았다. 생각보다 random 한 값이 안나온다. 수가 -6, -4, -2, 0, 2, 4, 6에서만 나오는 것이 가장 문제이고 ASLR이 적용되지 않은 시스템에서는 사용하지 못한다는 단점이 있다. 실용적이지는 못하지만, 그래도 새로운 방법을 창조했다는 것에 의의를 두자ㅋㅋ
내가 생각한 C언어 웹서버 구현 원리중의 고민 Layer7의 경빈이를 화요일에 만나서 이런저런 얘기를 하다가 다시 웹서버를 개발하겠다는 목표를 세우고 많은 것을 계획 중이다. 웹서버의 역할은 크게 3가지로 나눌 수 있을 것 같다. 1. Client의 요청을 받고 다시 Client로 HTTP Packet을 보내는 것. 2. HTTP Protocol에 맞게 Client Requests를 파싱하는 것. 3. html이든 php든 Client의 요청에 맞게 연결해주는 것. 일단 첫번째로 언급한 Client요청을 받고 다시 보내는 것은 C언어 TCP/IP 소켓 프로그래밍을 공부하면 충분히 할 수 있다. (참고로, 이 부분은 이미 완성한 상태이다.) 2번째로 Client request를 HTTP Protocol에 맞게 Parsing하는 것은 그럭저럭 할 수 있..
return과 exit()의 차이 https://stackoverflow.com/questions/3463551/what-is-the-difference-between-exit-and-return return은 함수를 종료하는 것이고,exit()는 프로세스 자체를 종료하는 것이다.