System Hacking/DreamHack

[Dreamhack] baby-bof

hanbunny 2025. 3. 28. 17:55

Description

Simple pwnable 101 challenge

Q. What is Return Address?

Q. Explain that why BOF is dangerous.

 

 

 

 


보호기법

 

코드 분석

 

win()함수분석

win함수를 실행하면 flag값을 읽어온다.

 

main()함수분석

이 부분에서는  name+idx*8을 사용해 메모리를 조작할 수 있음.

name을 시작 주소로 해서, 8바이트 간격으로 이동하며
value를 count번 메모리에 써 넣는 반복문이다.

즉, ebp 부터 ret주소 전까지 name+idx*8 이 값을 이용해 공간을 채워야한다.

 

idx주소 범위설명

count 값	
0일 때	        아무 것도 안 씀
1일 때	        name[0~7]에 value 씀
2일 때	        name[0~15]까지 씀 (버퍼 끝까지)
3일 때	        saved RBP까지 덮음
4일 때	        return address 바로 앞까지
5일 때 	    return address 정확히 덮음

 

 

 

그럼 ebp-ret 오프셋만 구하면됨.

여기서 0x10 만큼 rsp를 내려서 char name[16]; 같은 로컬 변수를 받음.

 

--------------------
char name -- 16byte
--------------------
sfp -- 8byte
--------------------
ret -- 8byte
--------------------

 

총 32byte 로 덮어야한다.

value를 count번 메모리에 넣게되니까 value값에 들어간 주소 8바이트가 총 5번 들어가야지 ret을 win()주소로 덮을 수 있음.

0x40125b 0x40125b 0x40125b 0x40125b 0x40125b

이런식으로 들어가게 되는거

./baby-bof로 실행해봄

 

프로그램을 실행시켜보면 win함수의 주소(0x40125b)를 알려줌.

그리고 name: 이 뜨면서 입력을 할 수 있다.  AAAAAA값을 입력해봄.

7fffacc5c300 위치에 AAAAAA값이 들어가 있는걸 확인 가능하고, 이후에 들어있는 값들이 나열됨.

 

 

win 함수 주소 ( 0x40125b )

실제로 찾아봐도 같은 값이 나옴.

리턴주소를 0x40125b로 바꿔 줘서 win함수를 실행시키면 될듯함.

 

다음 hex value값에 아까 나온 win 함수의 주소를 넣어주고 integer count에 5를 넣음.

FLAG값이 나옴.

이제 pwntools을 사용해 원격으로 페이로드로 보내봄.