War Game/Pwn(pwnable.kr)

[Pwnable.kr] mistake 문제풀이

zyari 2019. 12. 5. 12:09
반응형

먼저 mistake.c 내용을 확인한다.

 

이 코드를 보면 fd에 open함수의 결과가 들어가고 이것이 0보다 작은지 비교하는것처럼 보인다.

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)

하지만 연산자 우선순위가 =보다 <가 더 높기 때문에, open 결과 제대로 파일이 열리므로 양수를 반환하고, 이것이 0보다 작은지 비교하면 거짓이기 때문에 0이 나오므로 fd안에는 0이 들어가게 된다.

 

이 코드를 보면 fd안에 0이 들어가고, read함수는 0이면 std input이기 때문에 pw_buf는 사용자가 직접 입력할 수 있다.

if(!(len=read(fd,pw_buf,PW_LEN) > 0))

 

또한 아래의 코드를 통해서 buf_buf2도 사용자로부터 입력을 받을 수 있다.

scanf("%10s", pw_buf2);

 

그리고 pw_buf2를 1과 xor한다.

#define XORKEY 1

void xor(char* s, int len){
	int i;
	for(i=0; i<len; i++){
		s[i] ^= XORKEY;
	}
}

int main(int argc, char* argv[]){
	...
    
xor(pw_buf2, 10);

 

그리고 이 결과를 pw_buf와 비교한다.

if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
	printf("Password OK\n");
	system("/bin/cat flag\n");
}

 

이를 바탕으로 다음처럼 입력하면 플래그가 보인다.

반응형

'War Game > Pwn(pwnable.kr)' 카테고리의 다른 글

[Pwnable.kr] shellshock 문제풀이  (0) 2019.12.05
[Pwnable.kr] leg 문제풀이  (0) 2019.12.02
[Pwnable.kr] Input 문제풀이  (0) 2019.12.01
[Pwnable.kr] Passcode 문제풀이  (0) 2019.12.01