반응형
먼저 mistake.c 내용을 확인한다.
이 코드를 보면 fd에 open함수의 결과가 들어가고 이것이 0보다 작은지 비교하는것처럼 보인다.
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
하지만 연산자 우선순위가 =보다 <가 더 높기 때문에, open 결과 제대로 파일이 열리므로 양수를 반환하고, 이것이 0보다 작은지 비교하면 거짓이기 때문에 0이 나오므로 fd안에는 0이 들어가게 된다.
이 코드를 보면 fd안에 0이 들어가고, read함수는 0이면 std input이기 때문에 pw_buf는 사용자가 직접 입력할 수 있다.
if(!(len=read(fd,pw_buf,PW_LEN) > 0))
또한 아래의 코드를 통해서 buf_buf2도 사용자로부터 입력을 받을 수 있다.
scanf("%10s", pw_buf2);
그리고 pw_buf2를 1과 xor한다.
#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[]){
...
xor(pw_buf2, 10);
그리고 이 결과를 pw_buf와 비교한다.
if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
printf("Password OK\n");
system("/bin/cat flag\n");
}
이를 바탕으로 다음처럼 입력하면 플래그가 보인다.
반응형
'War Game > Pwn(pwnable.kr)' 카테고리의 다른 글
[Pwnable.kr] shellshock 문제풀이 (0) | 2019.12.05 |
---|---|
[Pwnable.kr] leg 문제풀이 (0) | 2019.12.02 |
[Pwnable.kr] Input 문제풀이 (0) | 2019.12.01 |
[Pwnable.kr] Passcode 문제풀이 (0) | 2019.12.01 |