오래 못 할 짓 하지 않기
[ 워게임 ] 44. Pwnable 10 : off_by_one_001 본문
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으로 인식되는 애가 들어간 것.
회고
다행히 문제가 쉬웠다.
메모리 계산할 필요가 없었음!
'보안_모의해킹 > CTF (Capture The Flag)' 카테고리의 다른 글
[ 워게임 ] 46. MISC 104 : broken-png (0) | 2025.02.16 |
---|---|
[ 워게임 ] 45. Crypto 559 : SingleByteXor (0) | 2025.02.16 |
[ 워게임 ] 43. Pwnable 117 : cmd_center (0) | 2025.02.15 |
[ 워게임 ] 42. Pwnable 32 : basic_exploitation_000 (0) | 2025.02.15 |
[ 워게임 ] 41. Pwnable 32 : ssp_000 (0) | 2025.02.14 |