pwnable.kr [collision] writeup

2019. 5. 2. 22:40System 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