runner를 gdb를 이용해서 제 쉘코드가 잘 작동하는지 살펴 볼려고 했습니다만 어떠한 쉘코드를 넣어도 쉘코드 첫 실행 구문부터 Program received signal SIGSEGV, Segmentation fault. 발생하며 멈춰버리더군요. 그래서 제 쉘코드가 잘못됐나 싶어서 자주 사용되는 shellcode들도 가지고 와서 넣어서 실행해봤는데 이 코드들도 마찬가지로 shellcode 첫줄 부터 Program received signal SIGSEGV, Segmentation fault를 발생하면서 멈춥니다. 그래서 컴파일 할 때 스택에 실행 권한을 안 준건가 싶어서 확인해 봤지만 make파일에 -z exestack 옵션이 있었으며, runner파일 자체도 /proc/pid/maps로 확인했을때 stack에 실행권한이 있는 것을 확인했습니다.
이제 더 이상 구글 검색과 제가 가지고 있는 지식으로는 못 풀 것 같아 질문을 올리게 되었습니다. 이 문제를 어떻게 해결하면 좋을까요?
(수정)
계산식을 풀어내는 코드를 c언어로 만든것이고
위 코드를 gcc -c로 오브젝트파일을 만들어서 objdunp -d로 코드를 뽑아내서 답안을 제출했을때의 사진입니다.그래서 왜 작동하지 않나 궁금해서 디버깅을 실시하였습니다.
--답안 코드 --
f30f1efa554889e54883ec20897dec488975e08b45ec83e8028945f8c745f400000000c745f000000000eb678b45f048984883c002488d14c500000000488b45e04801d0488b004889c7e8000000008945fc8b4dfc4863c14869c05655555548c1e8204889c289c8c1f81f89d629c689f089c201d201c289c829d085c075088b45fc0145f4eb088b45fc01c00145f48345f0018b45f03b45f87c918b45f44863d04869d21f85eb5148c1ea2089d1c1f9059929d189ca6bd26429d08945f48b45f4c9c3
위 사진처럼 그냥 코드 첫줄 부터 segementation fault를 발생하였습니다.
제코드가 잘못된건가 싶어서 그냥 ret만 하는 코드 c3 만을 넣었는대도 그냥 segementation fault가 발생하였습니다.
다시 답변 드립니다.
일단 로컬에서 직접 파일을 실행해서 하신 것 같으신데 nc host1.dreamhack.games xxxxx(포트)
를 통해서 서버에 직접 값을 넘겨주세요. 단일 바이너리 파일 실행으로 되는게 아니라서 여러가지 이유로 로컬에서 오류가 날 수 있습니다.
서버에서 해당 코드를 실행 결과 제대로 실행되긴 합니다만 결과 값이 다르네요.
아마 main에 그대로 코드를 짜서 그런것 같습니다. 따로 함수를 만들어서 실제 실행되는 형태 그대로 하셔야 정상적인 결과가 나올 것 같습니다. 아니면 직접 opcode를 이용해서 어셈블리어 코드를 짜시는 방법도 있습니다.