서버에 접속하여 passcode.c 파일을 보면 다음과 같다.
main 함수에서 welcome 함수와 login 함수를 실행하고 있고, wlecome 함수에서는 이름을 입력받아 출력하고 있고, login함수에서는 passcode1과 passcode2를 입력받고, 두 값이 모두 조건과 일치하면 시스템 함수로 cat flag를 실행한다. 그러나 두 값을 입력받는 곳을 보면 주소 연산자를 사용하고 있지 않아서 입력받아도 passcode1과 passcode2에는 입력받은 값이 들어갈 수 없다.
또한 login 함수에 있는 fflush(stdin)은 입력 버퍼를 지우는 코드이다. 그러나 리눅스에서 해당 코드는 실행이 안된다고 한다.
welcome함수와 login함수를 gdb로 보면 다음과 같다.
스택의 구조를 생각해보면 welcome 함수에서 name을 입력받기 전 0x70만큼의 공간을 확보하고 있고, login함수에서는 passcode를 입력받기 전 0x10만큼의 공간을 확보하고 있다. name의 크기는 100바이트 지만 0x70-0x10=0x60은 10진수로 96이므로 4바이트가 남고, int형 정수인 passcode1의 값을 변경시킬 수 있다. fflush의 got을 flag를 출력하는 시스템 함수의 주소로 바꾸면 flag를 출력할 수 있을 것 같다.
fflush plt에 들어가 fflush의 got주소를 구할 수 있다.
fflush의 got주소는 0x0804a004이다. 시스템 함수의 시작점은 0x080485e3이지만 scanf함수에서 정수로 받기 때문에 10진수로 변환하면 134514147 이다.
따라서 다음과 같이 payload를 작성하면 플래그를 얻을 수 있다.
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][pwnable.kr] mistake (0) | 2021.04.09 |
---|---|
[Project H4C][pwnable.kr] random (0) | 2021.04.08 |
[Project H4C] 포너블(시스템 해킹) 문제 서버 만들기(xinetd 활용) (0) | 2021.04.06 |
[Project H4C][pwnable.kr] flag (0) | 2021.04.02 |
[Project H4C][pwnable.kr] bof (0) | 2021.04.01 |