오래 못 할 짓 하지 않기

[ 워게임 ] 44. Pwnable 10 : off_by_one_001 본문

보안_모의해킹/CTF (Capture The Flag)

[ 워게임 ] 44. Pwnable 10 : off_by_one_001

쫑알bot 2025. 2. 16. 09:30
728x90

 

 

1. 42번 줄에서 name에 대해 20바이트 읽는다고 함.

2. read_str를 보면, 그 안에서 read를 인자로 받은 크기만큼(20바이트) 읽음. 

    > name[0:19] 가 채워짐

3. 다 읽은 후에는 name[20]에 '\0' 을 추가함.

 

   따지고 보면 name[20]에게 주어진 만큼 다 채우고 name[21]에 \0을 채운 셈이다.

 

name[20] 이후는 int age의 위치이기 때문에 여기에 \0이 들어간 것이다.

그럼 우린 name을 다 채우고 int 자리에 0을 넣으면 46번 조건문을 통과한다.

 

name[20] = name[0:19] 에 넣을 수 있음.

            근데 문제에선 name[0:20]까지 넣게 해줌.

            그럼 int age까지 침범한다.

 


 

 

 

따라서 함수에서 받거나 read할 땐 size-1로 받았어야 하는 것 같다.

len=read(0,ptr,size)   → len=read(0,ptr,size-1)

 


 

근데 \0도 0으로 인식 되어서 그냥 name[20]만 채워도 그 뒤에는 0이 들어가는 걸로 인식되는 것 같다.

위에서 난 그냥 정확히 0을 넣으려고 한 거고

아래에서는 그냥 0으로 인식되는 애가 들어간 것.


회고

 

다행히 문제가 쉬웠다.

메모리 계산할 필요가 없었음!