pwnable Toddler`s Bottle - collision
문제파악
이번 문제도 앞의 fd 문제와 유사하게 setuid 플래그가 활성화된 프로그램을 이용해서 root 권한의 flag 파일을 읽어드리는 문제라는 느낌이 한번에 온다.
소스 코드를 보면 20 byte 크기의 문자열(passcode)을 매개변수로 받아서 check_password라는 함수의 연산을 거친 결과물과 코드에서 hashcode로 하드코딩 된 값을 비교하여 같은 경우 flag를 읽게 된다.
그럼 중요하게 봐야할 것은 check_password 함수로 보여진다. 자세히 살펴보면 문자열 즉 char 형식으로 받은 데이터들을 int형으로 읽어드린다. 이 말은 쉽게 말하자면 길이가 20인 문자열을 길이가 5인 int 형 배열로 보겠다고 생각하면 된다.
예시로 “ABCD” 문자열을 인풋으로 들어가면 하나의 int 형 변수에는 0x41424344가 저장되게 된다.
하드코딩된 hashcode 값이 0x21DD09EC이고 계산식이 모든 int 형 데이터(5개)를 더하는 식이므로 더해서 0x21DD09EC가 되는 문자열을 매개변수로 전달하여 실행시키면 된다.
python
이번 문제에서는 hex값을 문자열로 바꾼 후 매개변수로 전달을 해야하는데 서버내에서 쓰기 권한이 없기 때문에 프로그램을 만들 수도 없고 기타 linux 유틸리티 프로그램을 사용해보려 했지만 쉽지 않았다. 따라서 이번에는 python script를 사용하게 되었다. 따로 파일을 생성할 필요없이 프로그램을 실행시킬 수 있기 때문에 선택하게 되었다.
위에서 보면 bytearray.fromhex().decode()를 사용해서 hex값으로 부터 적절한 string을 만들었고 subprocess를 이용하여 col 프로그램에 매개변수를 넣어주어 실행시켰다.
처음에는 21 dd 09 ec로 시도를 해보았지만 ascii 범위를 넘어간 값은 string을 만들지 못하기 때문에 에러가 나왔고. 00을 포함할시에도 null byte가 포함되어서 에러가 발생하여 20 byte를 모두 1이상의 값을 할당하여 계산하였다. 그리고 값이 들어가는 것을 보면 endian이 바뀌어서 들어가기 때문에 반대 순서로 값을 넘겨준 것이다.
참고 Link
subprocess : https://namioto.github.io/2018/03/27/subprocessing/
댓글남기기