ipwn

[pwnable.kr] mistake 본문

Write up/Pwnable.kr

[pwnable.kr] mistake

ipwn 2018. 1. 6. 17:23


이번 문제는 mistake문제이다. hint가 operator priority 즉 연산자 우선순위라고 한다.


한 번 서버에 접속해서 코드를 보겠다.



이 코드는 간단하게 password파일을 가져와서 입력받은 값을 1로 xor한 값과 비교해서 만약 같은 값을 갖고 있다면 


flag를 읽어와주는 코드라고 볼 수 있다. 하지만 이 코드에는 큰 결함이 있다.


일단 결함을 설명하기 전에 사진을 하나 보겠다.



이 사진에서 위에있을 수록 연산 우선순위가 높은 것을 의미한다.


즉 대소 비교 연산자는 대입 연산자보다 우선순위가 높은 것을 알 수 있다.


이제 다시 한 번 코드를 보겠다.



코드에서 이 부분을 보게되면 아차! 할 것이다. (참고로 password파일은 존재하기에 파일은 무사히 열린다.)


개발자의 의도는 fd에 file descriptor값을 넣은 뒤 fd < 0의 결과를 if문으로 검사하려했을 것이다.


하지만 = 연산자보다 < 연산자가 우위에 있기 때문에 0이 open함수의 반환값(file descriptor)보다 큰 지 비교를 먼저 한 뒤 


참 거짓을 판별한 값이 fd에 들어갈 것이다. 당연히 open함수는 무사히 실행 되므로 0보다 값이 크다. 


즉 fd에는 거짓을 의미하는 0의 값이 들어가게 되고, if문을 무사히 통과하게 된다. 그러므로 fd의 값은 stdin이 된다.



이 부분을 보면 fd가 stdin의 값을 지니고 있기에 pw_buf에 원하는 값 10자를 입력할 수 있다.


그리고 그 길이를 비교하는데, 이 부분에서도 자세히 보면 문제가 있다. read함수의 반환값이 0보다 큰지를 먼저 비교한 뒤


그 값이 len에 들어간 뒤 not 연산을 한다. 즉 if문을 무사히 통과할 수 있다. 사실 이 부분은 개발자의 생각의 흐름대로 


코드가 움직였더라도 if문을 무사히 통과할 수 있기는 하다. 아무튼 이 부분 뒤에는 scanf로 10byte만큼 


pw_buf2에 값을 입력받는다. 즉 pw_buf, pw_buf2에는 사용자가 원하는 값을 입력할 수 있다는 것이다.



그리고 pw_buf2는 이 부분으로 넘어와서 XORKEY(1)의 값과 pw_buf2의 index를 하나하나 xor연산을 수행하게 된다. 


그리고 그 값이 들어간 pw_buf2와 pw_buf를 strncmp함수를 이용해 같은지 비교를 한 뒤, 같은 값을 갖고 있다면 


flag를 읽어와준다. 이제 pw_buf에 넣을 값을 생각한 뒤 그 값을 1로 xor한 값을 pw_buf2에 넣어주면 되겠다.


입력 받는 값은 전부 문자열 형태이기 때문에 pw_buf2에 값을 넣을 때는 pw_buf의 index들의 아스키 코드 값을 1과 


xor해준 값이어야 할 것이다. 



'1'을 로 xor한 값은 '0'이다. 값을 넘겨줄 때 "1111111111"을 pw_buf에 넘겨주고 "0000000000"을 pw_buf2에 넘겨주겠다.



성공적으로 flag를 읽어왔다.








'Write up > Pwnable.kr' 카테고리의 다른 글

[pwnable.kr] uaf  (0) 2018.02.19
[pwnable.kr] shellshock  (0) 2018.01.06
[pwnable.kr] cmd2  (0) 2018.01.04
[pwnable.kr] cmd1  (0) 2018.01.04
[pwnable.kr] lotto  (0) 2018.01.03
Comments