[문제]
[풀이]
보호기법 분석
- 64bits 바이너리
- 카나리 존재
- NX bits 존재
- PIE 없음
소스코드 분석 - 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;
}
- 문제 힌트를 기반으로 연산자들이 사용된 코드 위주로 분석해봄
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
- 가장 먼저 password 파일을 읽어오는데, 작성자는 fd에 open에 대한 값을 할당한 후 비교 연산자가 수행되는 것을 의도했을 것임
- open 함수
- 연산자 우선순위
- 연산자 우선순위에 따라 다음과 같이 진행됨
- 사전에 정의되어 있는 password 파일을 read only로 읽어오는데 파일을 정상적으로 읽어오면 fd 값으로 양수가 반환됨
- 양수 < 0 → false 이므로 0이 fd에 저장됨
- 즉, fd는 0으로 표준 입력을 할 수 있음
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
- 작성자는 len에 read에 대한 값을 할당한 후 비교 연산자가 수행되는 것을 의도했을 것임
- read 함수
- 앞선 코드에 따라 read 함수의 fd에는 0(표준 입력)이 들어가고 입력 값은 pw_buf에 PW_LEN(10)만큼 저장될 것임
- read 함수가 정상적으로 작동되면 수신한 바이트 수를 반환하므로 비교 연산자와의 연산은 true가 됨
- 본래는 fd에 1이 들어가면서 password 파일을 읽을 수만 있도록 하는 것이 의도였겠으나, fd가 0이 되면서 password에 대한 입력 값을 사용자가 설정해줄 수 있게됨
- 이후에는 사용자에게 pw_buf2에 password 값을 입력 받아 1과 xor 연산을 수행한 후에 해당 값이 pw_buf와 같은지 비교하는 과정을 통해 일치하면 flag를 출력함
문제 해결
💡 pw_buf 값을 사용자가 줄 수 있음→ 사용자가 password를 위한 조건을 임의로 설정해줄 수 있음! 해당 값에 맞춰 1과 xor 연산 했을 때 나오는 값을 password로 입력해주면 될 것
- 단, len은 10으로 맞춰줘야 함
- 단순히 1111111111을 조건으로 설정해준다면 1과 xor 연산하여 나오는 0000000000을 입력해주면 됨
- 1111111111 전체에 대한 xor 연산(1111111110)으로 생각하면 안됨
- 반복문에서 1byte 단위로 xor 연산을 수행하기 때문에 각각에 대해 xor한 값을 넣어줘야 함
flag
🍒 Mommy, the operator priority always confuses me :(
'Wargame > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] blackjack (2) | 2022.10.15 |
---|---|
[Pwnable.kr] shellshock (0) | 2022.10.15 |
[Pwnable.kr] leg (2) | 2022.10.15 |
[Pwnable.kr] input (2) | 2022.10.15 |
[Pwnable.kr] random (0) | 2022.10.14 |