문제에 대해서 질문이 있습니다.

생각 순서는 이렇습니다.

우선 checksec 을 통해 운영체제를 확인하여 32bit 인것을 확인하였습니다.

  1. printf(buf); 코드를 보고 난 후, 이 부분에서 FSB 를 통해 메모리 주소값을 얻어내면 되겠구나.
  2. exit(0) 으로 끝나, ret 값이 없는건가?
  3. exit 함수는 got 에 주소값이 있다. 그럼 이 부분을 Got overwrite 를 해보자.
  4. got overwrite 를 통해서 exit_got 값 에는 get_shell 함수의 주소가 들어가면 메인함수가 실행되면서 system('/bin/sh'); 이 실행되겠지.

위와 같은 순서로 shellcode 를 작성하였습니다.

따라서 read를 통해 AAAA %p %p %p %p %p --- 를 넣어, AAAA 가 어디에 값이 들어가는지 offset 을 확인했더니, 1번째 offset 에서 값이 나오는 것을 확인할 수 있었습니다. ( 스택으로 인자를 전달해서 1번째인것인가? 라는 의문을 가졌습니다. %p 를 여러번 하였을 때, 아래와 같은 구조가 나와 어떻게 분석을 해야하지? 에 대해서도 물어보고 싶습니다.. )
image.png

그래서 이 부분에 ELF로 구한 exit의 got주소를 넣었습니다.
이후 got 주소를 출력해보았을 때, 8byte 를 차지하고 있는 것으로 보아, get_shell의 주소 ( gdb 를 통해 얻었습니다. )를 4byte 씩 나누어 1번째 offset 과 2번째 offset에 집어넣었습니다.
1번째 offset 의 경우, 앞서 구한 got의 주소를 넣은 부분의 크기만큼 빼주었고 값을 집어넣었다 생각했는데, 쉘이 EOF로 끊기고 맙니다.

질문은 아래와 같습니다.

  1. 어떤 부분에서 잘못되었나요?
  2. 위와 같이 AAAA %p %p .. 를 하였을 때, 스택 구조에 대해서 어떻게 해석을 하면 되나요?
#pwnable
작성자 정보
답변 2
avatar
wyv3rn
무플 방지 위원회장

에... 아무래도 길어질 것 같은데 일단 디스코드로 오시면 좋을 것 같습니다.

일단 대략 아래와 같습니다.

  1. 제가 본 문제점은 32비트인데 왜 got이 8바이트라고 생각하셨을까요?
    시나리오는 맞는데 그냥 bof와 같은 공격을 하신 것 같습니다.
    입니다.
  2. esp로부터 순차적으로 출력되는 값 입니다.
2023.01.10. 05:57
dkbic
대표 업적 없음

https://www.youtube.com/watch?v=t1LH9D5cuK4 참고하시면 좋을 것 같습니다.

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