728x90

연산자 우선순위때문에 코드에 오류가 있다고 한다.
코드를 보면,
#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;
}
password라는 파일을 fd로 읽어온 후 사용자에게 입력을 받아서 xor연산 후 비교하는 구조이다.
힌트로 연산자 우선순위가 있어서 요걸 어디에다가 써먹지 생각을 해보다가 pw비교문에선 오류가 없는것같아
fd로 읽어오는 부분을 보니, 잘못된게 바로 보였다.

c언어에선 대입연산자가 항상 최하위로 외우고 있었는데 대입이랑 비교연산자를 섞어놨으니 의도한 대로 코딩이 안되었을것이다.
//(open함수 링크 >>
비버퍼링 파일 열기 함수 - open()
앞으로 open(), creat(), read(), write(), lseek(), close() 함수에 대해서 차례로 살펴볼 것이다. 여섯개...
blog.naver.com
문제의 코드는 fd = open(경로, 읽기전용, 뭔 권한(?) ) < 0 인데 password파일은 잘 열릴꺼니깐 리턴값은 파일 디스크립터일것이고, 0보다 작지 않다. 그러면 연산자의 리턴값은 0, 따라서 fd에 0이 들어가고 키보드사용 표준 입력인데다가
sleep함수도 있으므로 그냥 입력하는게 pw_buf1에 들어간다.
그 후엔 pw_buf2같은건 그냥 입력하면 되고, xor연산을 잊으면 안된다.
a는 ascii로 97이고 1과 xor하면 96, `이다.

Mommy, the operator priority always confuses me :(
728x90
'pwnable > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] random (0) | 2020.10.09 |
---|---|
[pwnable.kr] passcode (0) | 2020.10.08 |
[pwnable.kr] lotto (0) | 2020.09.23 |
[pwnable.kr] flag (0) | 2020.09.23 |
[pwnable.kr] bof (0) | 2020.09.23 |