일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 가상메모리
- exec
- Deadlock
- ascii_easy
- 운영체제
- 알고리즘
- dfs
- 완전탐색
- 김건우
- 삼성기출
- 동기화문제
- 컴공복전
- 데드락
- 삼성리서치
- 백트래킹
- fork
- 백준
- 시뮬레이션
- 프로세스
- 스케줄링
- samsung research
- paging
- Memory Management
- BFS
- 구현
- BOJ
- pwnable.kr
- higunnew
- segmentation
- Brute Force
- Today
- Total
gunnew의 잡설
pwnable.kr 2. collision 본문
바로 문제로 들어가보자. unsigned long이라는 4bytes 공간에 0x21DD09EC가 저장되어 있다.
그리고 우리가 인자로 어떤 20bytes 짜리 문자열을 넘겨주면 그것을 int로 쪼개서 5번 더한 값이 0x21DD09EC가 되어야 한다.
쉽게 생각하자. 그러면 그냥 단순하게 4bytes씩 5개의 공간에 공평하게 같은 값이 들어가 있고 5로 나눈 나머지만 더하면 될 것 아닌가?
지금 해시코드가 0x21DD~ 이런 식이니까 어려울 수도 있는데 104라 해보자.
그러면 문제는 매우 쉬워진다. 각각이 20씩 가진 다음에 마지막에 4만 더하면 끝이다.
이것도 마찬가지이다. hashcode를 5로 나누어보자. 그러면 몫이 0x6C5CEC8이고 나머지는 4이다. 결국 우리는 6C5CEC8을 나타내는 문자열 5개와 마지막에서는 4를 더해주면 될 것이다. 그런데 여기서 주의해야 할 점은, 메모리에 0x6C5CEC8이 저장되는 방식이다. (little endian)
0x6C5CEC8을 정수로 읽고 싶다면 다음과 같이 저장되어 있어야 한다.
P + 0 |
0xC8 |
P + 1 |
0xCE |
P + 2 |
0xC5 |
P + 3 |
0x06 |
P + 4 |
0xC8 |
P + 5 |
0xCE |
P + 6 |
0xC5 |
P + 7 |
0x06 |
P + 8 |
0xC8 |
P + 9 |
0xCE |
P + 10 |
0xC5 |
P + 11 |
0x06 |
P + 12 |
0xC8 |
P + 13 |
0xCE |
P + 14 |
0xC5 |
P + 15 |
0x06 |
P + 16 |
0xCC |
P + 17 |
0xCE |
P + 18 |
0xC5 |
P + 19 |
0x06 |
그런데 난 여기서 도대체 어떻게 이 문자들을 표현해야 될지 감이 오지 않았다. 키보드 입력으로는 도저히 입력할 수 없는 값이었다. 어쩔 수 없이 해답을 검색해 보았다. 그리고 검색해보길 잘했다는 생각이 들었다. 내가 절대 모를 것이었다. 바로 다음과 python을 이용하여 입력해야 한다.
./col `python -c 'print("\xC8\xCE\xC5\x06"*4 + "\xCC\xCE\xC5\x06")'` |
'System Security' 카테고리의 다른 글
pwnable.kr 6. random (0) | 2020.02.05 |
---|---|
pwnable.kr 5. passcode (0) | 2020.02.04 |
pwnable.kr 4. flag (UPX unpacking problem) (0) | 2020.02.02 |
pwnable.kr 3. bof (Buffer overflow) (Stack smashing) (0) | 2020.02.02 |
pwnable.kr 1. fd(File Descriptor) (0) | 2020.02.02 |