password 파일의 fd를 fd변수에 저장시킨다.
이후 fd에 해당하는 파일을 read를 통해서 읽어들여 pw_buf에 저장한다.
pw_buf2 변수에는 직접 데이터를 입력시켜준다. pw_buf2 값을 xor 연산 한값을 pw_buf와 비교하여 문자열이 일치하면 flag를 보여준다.
pw_buf2를 XOR 연산해주는 xor 함수입니다. 각각 문자열들을 XORKEY 값인 1 을 이용해서 XOR연산 해줍니다.
해당문제의 취약점은 연산자 우선순위를 이용한 것이다.
>, < 가 = 연산보다 우선순위로 연산을 하기 때문에 빨간색 상자
open("/home/mistake/password".0,RDONLY,0400)< 0 의 연산의 경우
fd를 반환하는 open 함수에서 음수를 반환하지 않으므로 false 결과가 나온다.. false == 0
이후 fd에 해당 연산의 결과값인 0이 들어가게 되고
노란색 상자의 read함수의 fd에 0이 설정되어있기 때문에 우리가 원하는값을 입력시켜줄 수 있다. pw_buf 위치에
PW_LEN의 값은 10 이기때문에 10만큼 입력을 해줄 수 있다.
분석한것을 정리해보면
pw_buf 값 입력가능
pw_buf2값 입력가능
pw_buf2 값을 1과 xor 연산한 값이 같으면 플래그를 준다.
입력 사이즈는 10
xor 연산은 두개의 비트가 다르면 1 이 나오고 같으면 0을 출력해준다.
그로므로 pw_buf의 값엔 1111111111을 입력해주고
xor 연산을 하는 pw_buf2에는 0000000000을 입력해주어
xor 연산후 1111111111이 나오게 한다.
'Wargame_writeup > Pwnable.kr' 카테고리의 다른 글
blackjack (0) | 2018.12.19 |
---|---|
shellshock (0) | 2018.12.19 |
flag (0) | 2018.12.19 |
bof (0) | 2018.12.19 |
collision (0) | 2018.12.19 |