도저히 방법을 모르겠습니다..
Write() 함수를 통해서 stdout의 주소를 출력해서 libc 릭하는 것까지 했습니다. 그 다음에 puts의 got를 main 함수의 주소로 덮어서 입력을 반복할 수 있게 만들었습니다. (main 함수의 다른 오프셋으로 점프하면 스택 정렬이 깨지면서 바이너리가 종료되어서 무조건 main 함수의 시작 주소로 점프를 하게 되었습니다.)
두 번째 페이로드를 통해 puts_got의 원 가젯의 주소를 덮어서 쉘을 획득하려고 하였습니다. 하지만 입력가능한 크기보다 주소의 크기가 너무 커서 한번에는 힘들다는 것을 알고 여러 시도를 하였습니다.
- main 함수의 Init이 실행되지 않게 해서 val 변수에 값을 계속 누적시키는 방법 -> 실패: main 함수의 다른 오프셋으로 puts의 got를 덮어서 실행흐름을 조작하면 SIGSEV 발생.
- 값이 초기화 되지 메모리 공간에 값을 누적시킨 다음에 Write() 함수를 통해서 값을 쓰는 방법 -> 실패: Write() 함수의 *ptr = val; 라는 코드로는 불가능 임의 주소를 역참조해서 그 값을 *ptr에 저장하는 코드가 있어야함.
어떻게 libc 주소를 써야할지 모르겠습니다. 조금만 힌트를 주시면 감사하겠습니다.
#pwnable
작성자 정보
답변
1
리신뭐해갱오라고
대표 업적 없음
6바이트로 표현하는 큰 숫자(예시 0x7fab2345bf78)를 써야하지만 val 변수에 넣을 수 있는 수가 작아서 힘들다는 뜻인가요?
그럼 ptr를 2씩 늘리면서 한번에 2바이트씩 3번에 나눠서 써보세요 그리고 원 가젯은 조건을 맞추기 힘드니 다른 방법을 생각해보는게 좋을 듯 합니다.