Pwnstar
Pwnable.kr mistake 본문
9번째 문제 mistake이다.
리얼 이벤트에 기반을 둔 문제라고 한다... 힌트는 연산자 우선순위
우선 접속해보자.
소스코드는 다음과 같다.
#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;
}
64비트 바이너리이고, 카나리와 nx가 걸려있다.
우선 처음 if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0) <- 이 부분에서 < 이 = 보다 우선순위가 높기 때문에 open("/home/mistake/password",O_RDONLY,0400) 이 값고 0의 값을 비교한 결과가 fd에 들어가게 된다.
("/home/mistake/password",O_RDONLY,0400)은 참의 값일테니 0보다 클 것이고 ("/home/mistake/password",O_RDONLY,0400)<0 은 거짓이니 0이 fd에 들어가게 된다.
그리고 그 다음 if문에서도 if(!(len=read(fd,pw_buf,PW_LEN) > 0))read 함수에 fd(0)이 들어가게 되면 입력을 받을 수 있으니 pw_buf에 원하는 값을 입력할 수 있고, 바로 밑에서는 pw_buf2에 또 원하는 값을 입력할 수 있다.
xor 함수에서는 pw_buf2의 값을 xor해주고, xor한 pw_buf2의 값과 그 전에 입력한 pw_buf의 값이 같다면 플래그를 보여줄 것이다.
그러면 0과 1을 입력해보자
이렇게만 입력하면 될 줄 알았는데 안된다...
아마 xor(pw_buf2, 10); 이 부분에서 길이 10만큼 xor해주기 때문인 것 같은데 그러면 10자리 꽉 채워서 입력해보자.
오!! 맞나보다
플래그는 저렇게
끗
'Pwnable.kr > Toddler's Bottle' 카테고리의 다른 글
Pwnable.kr coin1 (0) | 2020.03.16 |
---|---|
Pwnable.kr shellshock (0) | 2020.03.16 |
Pwnable.kr input (0) | 2020.03.15 |
Pwnable.kr random (0) | 2020.03.15 |
Pwnable.kr passcode (0) | 2020.03.15 |