블로그 이전했습니다. https://jeongzero.oopy.io/
[HackCTF] Beginner Heap
본문 바로가기
워게임/HackCTF

[HackCTF] Beginner Heap

728x90

[HackCTF] Beginner_Heap

Date
Tags report

 

1. 문제


1) mitigation 확인

PIE가 걸려있지 않기 때문에 got overwrite가 가능할 것이다

 

 

2) 문제 확인

바이너리를 실행시키면 아무것도 뜨지 않고 바로 입력을 받는다. 총 2번 입력을 받고 바로 종료가 된다. 문제만 봐서는 어떤 동작을 하는 프로그램인 파악이 안가기 때문에 아이다로 코드를 한번 봐보자

 

3) 코드 확인

malloc을 총 4번 하고 fgets를 통해 입력한 데이터를 strcpy 함수를 이용하여 복사를 한다.

위 과정을 디버깅하여 취약점을 찾아내야 한다. 만약 취약점을 찾았다면, got를 덮을수 있는지봐야하고, 이게 가능하다면 제공된 함수 중 sub_400826 로 이동시키게 해야한다.

 

 

sub_400826 는 다음과 같다. 그냥 해당 함수를 호출하면 될것같지만 해보지않고서는 잘 모르니 일단 해당 함수를 호출할 수 있게끔 조져보자.

 

 

2. 접근방법


 

메모리 구조는 다음처럼 생겼다. 처음 v3에 0x10 크기 만큼 할당 받고, v3이 가리키는 힙영역에 1을 넣는다. 그다음 v3+1가 가리키는 곳에 0x8 사이즈 만큼 한번더 동적할당을 한다. 근데 자세히 보면 해당 영역은 v3에서 0x20 만큼 떨어져 있다.

 

그리고 fgets에서 큰 사이즈만큼 입력이 가능하다. 이 부분에서 취약점이 발생한다. 입력한 데이터를 v3+1이 가리키는 곳에 복사하는데 이는 v4와 거리가 얼마 안떨어져 있다.

 

만약 0x30 크기 만큼 입력을 하고 strcpy를 실행한다면 v4+1위치에 들어있는 값을 수정가능 할 것이다. 이 부분을 Exit함수의 got로 변경해보자.

 

 

(중간에 롸업쓰다가 멈춰서 주소가 달라졌다. 참고하시길)

 

0x602058 주소에 Exit_got가 잘 들어가 있다. fgets에 sub머시기 함수의 주소를 입력하면 strcpy를 통하여 got에 들어있는 값을 변경 가능하다

 

 

정상적으로 got가 sub_400826 주소로 변경되었다. 이제 메인에서 exit(0) 실행되면 sub_400826 함수가 실행될 것이다.

 

 

3. 풀이


최종 익스 코드는 다음과 같다

 

from pwn import *
context.log_level = "debug"
#p = remote("ctf.j0n9hyun.xyz",3016)
p=process("./beginner_heap.bin",aslr=False)
gdb.attach(p,""" b* 0x4009ab """)
payload = "A"*40+p64(0x0000000000601068) # exit got

p.sendline(payload)
p.sendline(p64(0x400826))


p.interactive()

 

 

4. 몰랐던 개념


힙 관련 지식은 딱히 필요없었다.

 

728x90

'워게임 > HackCTF' 카테고리의 다른 글

[HackCTF] pwning  (0) 2020.04.11
[HackCTF] Look at me  (0) 2020.04.11
[HackCTF] yes or no  (0) 2020.04.11
[HackCTF] x64 Simple size BOF  (0) 2020.04.11
[HackCTF] x64 Buffer Overflow  (0) 2020.04.11