도저히 방법을 모르겠습니다..

Write() 함수를 통해서 stdout의 주소를 출력해서 libc 릭하는 것까지 했습니다. 그 다음에 puts의 got를 main 함수의 주소로 덮어서 입력을 반복할 수 있게 만들었습니다. (main 함수의 다른 오프셋으로 점프하면 스택 정렬이 깨지면서 바이너리가 종료되어서 무조건 main 함수의 시작 주소로 점프를 하게 되었습니다.)

두 번째 페이로드를 통해 puts_got의 원 가젯의 주소를 덮어서 쉘을 획득하려고 하였습니다. 하지만 입력가능한 크기보다 주소의 크기가 너무 커서 한번에는 힘들다는 것을 알고 여러 시도를 하였습니다.

  1. main 함수의 Init이 실행되지 않게 해서 val 변수에 값을 계속 누적시키는 방법 -> 실패: main 함수의 다른 오프셋으로 puts의 got를 덮어서 실행흐름을 조작하면 SIGSEV 발생.
  2. 값이 초기화 되지 메모리 공간에 값을 누적시킨 다음에 Write() 함수를 통해서 값을 쓰는 방법 -> 실패: Write() 함수의 *ptr = val; 라는 코드로는 불가능 임의 주소를 역참조해서 그 값을 *ptr에 저장하는 코드가 있어야함.

어떻게 libc 주소를 써야할지 모르겠습니다. 조금만 힌트를 주시면 감사하겠습니다.

#pwnable
작성자 정보
답변 1

6바이트로 표현하는 큰 숫자(예시 0x7fab2345bf78)를 써야하지만 val 변수에 넣을 수 있는 수가 작아서 힘들다는 뜻인가요?
그럼 ptr를 2씩 늘리면서 한번에 2바이트씩 3번에 나눠서 써보세요 그리고 원 가젯은 조건을 맞추기 힘드니 다른 방법을 생각해보는게 좋을 듯 합니다.

2024.05.01. 13:48
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기