mistake - 1 pt
We all make mistakes, let's move on.
(don't take this too seriously, no fancy hacking skill is required at all)
This task is based on real event
Thanks to dhmonkey
hint : operator priority
ssh mistake@pwnable.kr -p2222 (pw:guest)
ssh 접속을 하고, 코드를 살펴봅시다.
mistake@ubuntu:~$ ls -l
total 24
-r-------- 1 mistake_pwn root 51 Jul 29 2014 flag
-r-sr-x--- 1 mistake_pwn mistake 8934 Aug 1 2014 mistake
-rw-r--r-- 1 root root 792 Aug 1 2014 mistake.c
-r-------- 1 mistake_pwn root 10 Jul 29 2014 password
mistake@ubuntu:~$ cat mistake.c
#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;
}
문제 제목이 mistake이다.
힌트는 operator priority 연산자 우선순위.
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
이 코드를 보면 open함수의 반환값인 fd의 값과 0을 비교하는 것 처럼 보이지만 사실 비교 연산자 (<)가 산술연산자 (=) 보다 우선순위가 높기 때문에
open함수의 반환값과 0을 비교한 결과가 fd에 들어가게 된다.
위 코드가 실행될 때 open함수에서 파일이 정상적으로 열려서 양수를 반환하게 된다.
그리고 0과 비교했을 때 Fasle 이므로 fd에는 0이 들어가게 된다.
그 다음,
if(!(len=read(fd,pw_buf,PW_LEN) > 0))
이 부분도 마찬가지.
일단 fd에 0이 들어갔다. read함수에서 fd = 0이면 stdin을 의미한다. 사용자로부터 입력값을 받는다.
입력값이 pw_buf에 들어가기 때문에 pw_buf의 값을 우리 마음대로 설정할 수 있다!
그 뒤에
scanf("%10s", pw_buf2);
를 통해 pw_buf2의 값을 입력받기 때문에
pw_buf, pw_buf2 모두 우리 모두 설정할 수 있다.
그 뒤에 pw_buf2를 1과 xor한 값과 pw_buf가 같으면 플래그를 뿌려주게 된다.
mistake@ubuntu:~$ ./mistake
do not bruteforce...
1111111111
input password : 0000000000
Password OK
Mommy, the operator priority always confuses me :(
'WAR GAME > Pwnable.kr' 카테고리의 다른 글
pwnable.kr [coin1] 풀이 (2) | 2018.03.12 |
---|---|
pwnable.kr [shellshock] 풀이 (0) | 2018.03.08 |
pwnable.kr [leg] 풀이 (0) | 2018.03.07 |
pwnable.kr [input] 풀이 (0) | 2018.03.06 |
pwnable.kr [random] 풀이 (0) | 2018.02.26 |