완료됨
shellcode 직접 생성해서 푸는 경우 질문입니다.

학습을 위해 shellcraft를 사용하지 않고 직접 assembly code를 짜서 shellcode로 변환시켜서 풀어보려고 했는데요.

shellcode를 변환시키면 "\x48\xb8\x6f\x6f...." 이렇게 시작합니다.
그런데 remote로 보내보면 실패해서 shellcraft 코드랑 차이점을 비교해보니
위 shellcode 앞에 \x6a\x00 을 붙여서 보내더라고요. (\x6a\x00\x48\xb8\x6f\x6f 이런식으로.. <- 성공합니다.)

\x6a\x00의 의미와 역할이 어떻게 될까요?
00은 null 이고.. 6a는 j 같은데 왜 이걸 보내야 할까요? 다른 것으로 대체하면 또 안되더라고요.

조언 부탁드립니다.

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
avatar
bincat
세계수

https://defuse.ca/online-x86-assembler.htm#disassembly2 와 같은 곳에서 6a00을 검색해보셔도 되고,
print (disasm(b"\x6a\x00")) 을 해보셔도 확인하실 수 있습니다.
문자열을 만들기 위해 마지막 부분에 null 을 push해주는 부분입니다.
스택의 쓰레기 값이 존재하는 경우에는 null이 없으면 문자열이 의도한것과 다르게 나올 수 있습니다.

2023.02.13. 00:14