728x90
1. 문제
#include <stdio.h>
#include <fcntl.h>
#define PW_LEN 10
#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[]){
int fd;
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
printf("do not bruteforce...\n");
sleep(time(0)%20);
char pw_buf[PW_LEN+1];
int len;
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
printf("read error\n");
close(fd);
return 0;
}
char pw_buf2[PW_LEN+1];
printf("input password : ");
scanf("%10s", pw_buf2);
// xor your input
xor(pw_buf2, 10);
if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
printf("Password OK\n");
system("/bin/cat flag\n");
}
else{
printf("Wrong Password\n");
}
close(fd);
return 0;
}
힌트 : 연산자 우선순위
2. 접근방법
...
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
printf("do not bruteforce...\n");
sleep(time(0)%20);
char pw_buf[PW_LEN+1];
int len;
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
printf("read error\n");
close(fd);
return 0;
}
...
연산자 우선순위가 힌트다. 여기서 연산자 우선순위가 먹힐만한 곳은 정해져있다. 처음에 password 파일을 열고, 정상적이라면 fd=3에 할당받을것이다. 만약 그 값이 음수면 종료되는 예외처리가 있다. 헌데 연산자 우선순위에서 < 가 = 보다 더 높은 순위이므로 open() 결과인 3 < 0 이 먼저 연산된다.
따라서 해당 연산결과는 false로 0이 나오게 되고 이 값을 fd에 넣어 if(0) 가 된다. 두번째로 아래 read함수 역시, read()의 반환값 즉, 입력 받은 값을 0과 비교하고, 양수면 이를 len에 넣는다.
따라서 read()의 fd=0로 입력을 하기만 하면 에러는 안난다. fd=0이 됬으므로 사용자의 입력을 10개 받고, input password : 을 잘 맞춰주면 된다.
1을 입력하면 이는 아스키로 0x31 이므로 0x31 ^ 1 = 0x30 을 이용해서
- 1 * 10
- 0 * 10
을 입력해주면 된다. (여기서 1과 2는 scanf에서 %s로 입력받으므로 아스키값으로 xor 연산이 된다)
3. 풀이
4. 몰랐던 개념
728x90
'워게임 > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] md5 calculator (0) | 2020.09.23 |
---|---|
[pwnable.kr] brainfuck (0) | 2020.09.23 |
[pwnble.kr] leg (0) | 2020.09.06 |
[pwnable.kr] shellshock (0) | 2020.09.06 |
[pwnable.kr] input (0) | 2020.09.06 |