본문 바로가기

Wargame, CTF/protostar

heap0

소스코드

heap overflow를 이용해

winner()를 실행시키면 pass

 

heap의 구조

그림처럼 malloc으로 128바이트를 동적할당 할 시

앞에 type과 size가 8바이트를 차지하고

밑의 data가 동적할당한 크기만큼 생성이되며

더 밑에 footer가 붙을 수도 있음

 

gdb heap0 main

일단 첫 malloc과 2번째 malloc으로 

할당된 메모리의 주소

d와 f가 가진 주소를 찾음

이 주소는 위의 heap의 구조 그림에서 type의 시작번지가 아닌

data의 시작번지를 반환해서 eax에 넘겨줌

 

main+21, 37에 bp를 걸어주고

 

AAAA를 인자로 주고 run

d의 data주소는0x804a1a0

 

f의 data시작 주소는 0x804a1f0

 

strcpy가 동작한 후인

main+107부분에 bp를 걸고

d의 data주소-0x8 (type과 size부분도 출력하기 위해)를 보면

 

빨간동그라미 2개의 앞에 있는 51과 11은 size

41414141은 입력한 AAAA

0x08048478은 nowinner의 주소

 

winner의 주소를 찾아서 

heap overflow를 발생시켜

nowinner의 주소가 있는 곳을 

winner의 주소로 덮으면된다

41414141부터 nowinner의 주소가 있는 f의 data까지의

offset은 80바이트

 

pass

 

'Wargame, CTF > protostar' 카테고리의 다른 글

heap2  (0) 2020.02.27
heap1  (0) 2020.02.27
format4  (0) 2020.02.26
format3  (0) 2020.02.26
format2  (0) 2020.02.26