문제는 풀었지만 이상한 것 같아서 질문합니다.

문제 푸는 형식은

  1. libc_base를 구하고 free_hook 주소를 계산
    2-1. one_gadget을 이용하여 가젯을 사용하거나
    2-2. main에 있는 system("/bin/sh") 호출하는 주소를
  2. free_hook 포인터 변수에 담는다.
    이런 식으로 풀었는데
    문제는 페이로드 작성 후 send할 때 값이 원하는 의도대로 전달되지 않았습니다.
    payload = p64(free_hook) + p64(main_system) #혹은 one_gadget
    처음에 위와 같이 페이로드를 작성하였습니다.
    free_hoox = 0x7fe5716318e8
    main = 0x400a11 이라고 했을 때
    malloc(size)로 할당받은 힙 영역에는
    '\xe8\x18cq\xe5\x7f\x00\x00\x11\n@\x00\x00\x00\x00\x00' 이 들어가길 원했는데
    맨 앞에 있는 '\xe8'이 없어지고 한 칸씩 앞으로 당겨진 값이 들어가졌습니다.
    즉 '\x18cq\xe5\x7f\x00\x00\x11\n@\x00\x00\x00\x00\x00'이 들어가졌습니다.
    그래서 원래 의도는 0x7fe5716318e8 주소에 0x400a11 값을 넣는거였는데
    디버깅을 해보니 0x1100007fe5716318 주소를 참조하더라구요. 그래서 에러가 납니다.
    그래서 일단은 페이로드 맨 앞에 '\x00'을 붙이니 성공하긴 하는데 왜 이런 일이 발생하는 지 궁금합니다.

아래는 attack.py 에서 제가 send를 이용해서 데이터 보낸 형식입니다.
p.send(str(400))
p.send(payload)
p.interactive()

질문

  1. 처음에는 스스로 풀었는데 계속 안되길래 다른 라이트업을 봐도 다들 저랑 비슷하게 작성했는데 왜 저만 이런 결과가 나오는 걸까요?
  2. 추가로 one_gadget이 여러 개 있던데, 어떤 건 되고 어떤 건 안됩니다. 예를 들어 로컬에서는 3번째 one_gadget_offset만 적용되고 원격에서는 2번째 one_gadget_offset만 적용이 됩니다. 그 이유를 알 수 있을까요?
#pwnable
작성자 정보
답변 3
avatar
wyv3rn
무플 방지 위원회장

1번은 조금 애매하네요
직접 봐야 알 것 같습니다.
2번은 원가젯을 실행해보시면 요구 조건이 있는데 이게 시스템마다 맞춰질 수도 있고 아닐 수도 있습니다.
그래서 최대한 서버의 환경과 동일하게 구성해서 시도하는거고요.

2023.02.13. 19:28
avatar
IRev
2023 Christmas CTF 참여


실행했을 때 출력하는 각 심볼의 주소입니다. print(payload)하면 원하는 페이로드가 정상적으로 되는데 정작 입력된 데이터는 아래 사진과 같습니다.


위를 디버깅 했을 때 send(payload) 이후의 협영역에 들어간 값입니다.

2023.02.13. 19:38
avatar
Sechack
CTF First Place

size입력할때 scanf로 입력받아서 sendline을 해야하는데 send를 해버리니까 뒤에 입력 하나가 scanf로 들어가면서 씹힌거에요.

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