2019. 5. 2. 22:40ㆍSystem Hacking/pwnable.kr
안녕하세요!
오늘은 pwnable.kr
collision 문제를 풀어보도록 하겠습니다!
소스코드는 아래와 같습니다!
제일 위에
hashcode라는 변수에 0x21DD09EC라는 값이 담겨있네요!
그리고 check_password라는 함수가 있습니다!
인자로는 char형의 포인터가 들어갑니다!
근데 이후에 바로
이 포인터가 형 변환이 일어납니다!
char 형의 포인터에서 int형의 포인터로 말이죠!
char* p -> int * p
(이 바뀌는 부분이 끼칠 영향은 아래에서 더욱 자세하게 설명드릴게요)
왜냐하면 (int*)p라고 되어있잖아요!
그리고 이 변환된 pointer는 ip의 포인터에 담기게 됩니다!
그리고 i라는 변수가 선언되고
res라는 변수도 0으로
선언과 동시에 초기화가 됩니다
그리고 5번 for문을 돕니다!
(i =0,1,2,3,4)
매번 for문을 돌때마다
ip[0], ip[1],.....,ip[4]의 값이
모두 res에
저장됩니다!
main 함수에서는
처음에 argument 갯수가 2개 이상이여야 한다!
그리고 첫 번째 argument (=argv[1])의 길이가
정확히 20이여야 한다
마지막으로 문제를 해결하는 구간이 있는 곳!
hashcode는 저희가 맨 처음에
선언 되었던 변수 값이죠!
(0x21DD09EC)
결국 argv[1]으로 입력한 값과
hashcode 값을 비교해서 같으면!
문제가 풀리게 됩니다!
자 이제 위에서 말한
char 형 포인터가 int형 포인터로 바뀌면
어떻게 되는지 설명 드리겠습니다!
우선 char형에서 int 형에서 바뀌었다는 건
2가지 change를 의미합니다!
(1) 포인터가 가리키는 값의 형태 변환
(2) 포인터가 읽어들이는 단위의 변화
(1)을 설명드리자면
char 형 포인터를 통해서 123을 가져오면
이 123은 char 형입니다
(=문자라는 이야기)
하지만 int 형의 포인터를 통해서 123을 가져오면
이 123은 int 형입니다!
(=숫자라는 이야기)
(2)의 경우
char 형의 포인터는 값을 1byte씩 읽어오는데
int 형의 포인터는 값을 4byte씩 읽어오게 됩니다!
그래서 문자열 길이를 4byte씩 끊어서
아래와 같이 해야합니다!
문제에서 argv[1]의 길이를
20byte로 하라고 했으니
저렇게 4byte 문자
5개를 주면 20byte가 되죠?
그리고 이걸 5개로 쪼개어서
각각
자릿수를 더하면 저희가 원하는 hashcode 값이 나오게 됩니다!
exploit code를 보시면
[0]번째에 있는
0x1dd905e8을 주고
나머지 4개는 0x01010101을 주면
0x1dd905e8+0x01010101+0x01010101+0x01010101+0x01010101
0x21dd09ec라는 값이 나오게 됩니다!
그래서 아래와 같이
문제가 풀리게 됩니다!
고생하셨습니다!
'System Hacking > pwnable.kr' 카테고리의 다른 글
pwnable.kr [random] writeup (0) | 2019.05.03 |
---|---|
pwnable.kr [bof] writeup (0) | 2019.05.01 |
pwnable.kr [fd] writeup (0) | 2019.04.29 |