본문 바로가기

Wargame, CTF/protostar

heap1

소스코드

malloc이 4번있고

strcpy가 두 번있음

더블strcpy를 이용해서 winner를 샐행시켜야함

 

heap1의 동작

인자를 2개 주어야함

 

gdb heap main

첫 malloc이후 bp를 걸어 동적 할당된 메모리 주소를 찾음

인자로 aaaa bbbb를 준고 run

0x804a1a0

2번째 strcpy가 실행된 이후 heap의 상태를 확인

 

4개의 malloc이후 정상적으로 aaaa와 bbbb가 삽입됨

 

앞의 코드에서 name은 포인터 변수이기 때문에

aaaa와 bbbb는 빨간 동그라미의 주소에 들어간 것을 알 수 있음

첫번째 인자다음 i2->name의 주소까지 20바이트

 

그래서 첫번째 인자로 20바이트를 채운다음 

3번째로 동적할당 받은 i2->name의 주소를

printf의 got로 바꿔서 두번째 인자를 winner의 주소를 주면

두번째 strcpy로 인해 printf의 got가 winner로 변경되어서

winner가 실행됨

코드 마지막에있는 printf의 got를 winner의 주소로 변경시켜줌

 

printf의 got 0x8049774

 

gdb 인자를 python으로 넘기는 법

원래 i2->name의 주소가 있어야 할 자리에

printf의 got가 들어감

저렇게 되면 두번째 strcpy가 실행될 때

printf의 got에 두번째 인자가 씌어질꺼임

 

winner의 주소

 

첫번째 인자로는 'a'*20+printf의 got를 줬고

두번째 인자로는 winner의 주소를 줌

 

printf의 got에 winner의 주소가 들어감

continue를 해보면

 

pass

 

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

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