Un_Woo
pwnable.kr mistake 본문
mistake
문제를 보면 무엇인가 실수를 했고 연산자 우선순위를 힌트로 줬다.
일단 실행을 해보니 두 번 입력을 받는 것을 알 수가 있다.
그리고 gdb에서도 실행시켜 봤는데 open 함수가 실패하여 -1을 리턴한 것으로 보인다.
그런데 can't open password 뒤에 1이 있는 것이 이해가 되지 않았다.
코드를 보면 그 뒤에 있어야 하는 것은 fd의 값인 -1이라고 생각했기 때문이다.
하지만 왜 1이 나오는지 이해를 못 하고 있었던 중 힌트였던 연산자 우선순위가 생각나
구글링을 해봤다.
그리고 코드에서 문자가 있는 부분은if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)이라고 생각했으므로 이 코드에 쓰인 =과 <만을 봤다.
그 결과, <가 =보다 우선순위가 높다는 것을 알 수 있었다.
그러므로 if((fd=open("/home/mistake/password",O_RDONLY,0400)) < 0)라고 써야했던 것을 실수해서 저렇게 썼다는 것을 알 수 있었다.
이 정보들을 조합하면 open이 실패해서 -1이 리턴되었고 그게 0보다 작으므로 true(=1)이 리턴되어 fd가 1이 된 것이다.
그렇다면 open이 성공했을 경우에는 3이 리턴될텐데 그게 0보다 크므로 false(=0)이 리턴되어 fd가 0이 된다.
그러므로 read(fd,pw_buf,PW_LEN)은 read(0,pw_buf,10)이 되고 여기서 pw_buf에 입력을 할 수 있다.
결론적으로 pw_buf와 pw_buf2에
전부 입력을 하는 것이다.
그리고 pw_buf2를 1과 xor연산하는데
xor연산한 값이 pw_buf와 같아야 한다
1과 b를 xor연산한 값이 c이므로 pw_buf에는 bbbbbbbbbb를 pw_buf2에는 cccccccccc를 입력했다.
'System > pwnable.kr' 카테고리의 다른 글
pwnable.kr cmd1 (0) | 2018.04.04 |
---|---|
pwnable.kr lotto (0) | 2018.04.04 |
pwnable.kr random (0) | 2018.04.04 |
pwnable.kr passcode (0) | 2018.04.04 |
pwnable.kr flag (0) | 2018.04.04 |