C, INT

2013-02-09 1 views
1

내가 존 에릭슨의 책, Hacking: The Art of Exploitation에서이 소스를 발견 작성, 시스템 호출을 쓰기는 C, INT

userid = getuid(); // get the real user ID 
// Writing data 
if(write(fd, &userid, 4) == -1) // write user ID before note data 
    fatal("in main() while writing userid to file"); 
write(fd, "\n", 1); // terminate line 

나는 무엇 인 (이 코드를 컴파일하려고 내가 쓰는 파일, 사용자 ID에 그 발견 위의 코드에서 작성))가 올바르지 않습니다. 그들은 단지 이상한 성격을 썼다 (나는 여기에 그것을 쓰는 것이 중요하지 않다고 생각한다). 그래서 문제는 int을 쓸 함수의 결과가 char * 인 것으로 전달하려고하기 때문에 쓰려는 파일의 결과가 false이기 때문입니다.

버그입니다. 맞습니까?

+3

'write (fd, & userid, 4)'는 이진 표현을 파일에 씁니다. 텍스트 편집기가 그것을 이해하지 못합니다. –

+0

'man write' (또는 google it)을 사용하십시오. 'write' 시스템 호출은'char *'가 아닌'const void *'를 사용합니다. 이것은 정수가 아닌 이진 표현 (정수가 char로 인코딩되지 않음)과 관련된 문제입니다. – RageD

답변

5

write() 함수는 버퍼에 대해 void *을 필요로합니다. 임의의 2 진 데이터를 씁니다. 문자열로 변환해야하는 경우 printf()을 사용하십시오.

당신은 userid의 선언을 표시하지 않습니다,하지만 write() 라인은 다음과 같이 기록한다 :이 짧은 쓰기를 감지합니다

if (write(fd, &userid, sizeof(userid)) != sizeof(userid)) 

및 기타 문제 (정수 유형의 문제가 될 가능성이) userid 유형에 관계없이 올바르게 작동합니다. 따라서 원래 버전의 라인은 틀림없이 버그가 있습니다. 그렇지 않으면 버그가 코드 자체가 아닌 기대치에있는 것 같습니다.

2

아니요, 버그가 아니며, 오해입니다. write 호출은 메모리에있는 이진 표현을 씁니다. 읽을 수있는 버전을 얻으려면 fprintf과 같은 것이 필요할 것입니다.

예를 들어 7의 이진 표현은 4 바이트 0, 0, 0 및 7 일 수 있습니다.이 표현은 텍스트 표현 인 단일 바이트 55 (ASCII 가정)처럼 보이지는 않습니다.

이식성이 없기 때문에 정수와 4 같은 길이를 하드 코딩하는 것은 좋지 않은 생각입니다. sizeof(userid)과 같은 것을 사용하는 것이 더 좋을 것입니다.

+0

감사합니다. 그 소스 코드에는 버그가 없습니다. 그냥 메모리에 무엇을 써주세요. 4 비트 (보통 크기 인 integer