-
[Toddlers's Bottle] collisionWargame/pwnable.kr Challenge 2019. 1. 17. 19:20
→ 문제는 아래와 같다.
→ 로그인 후 파일 확인.
→ col.c 소스코드 확인.
→ 문제 해결을 위해선, hashcode == check_password(artv[1])의 값이 참으로 만들어야 한다. 이 때, hashcode 값은 0x21DD09EC이고, check_password(argv[1])의 값이랑 비교한다.
→ check_password 함수를 살펴보면, 인자 값으로 argv[1] 값을 받고 이를 ip 배열로 받아 더하여 리턴한다.
→ 두번째 분기문에서 strlen(argv[1]) != 20 에 의해 실행 인자 값은 반드시 20바이트이여야 한다.
→ 결국 20바이트의 passcode 인자 값을 통해 check_password 함수 연산 결과와 0x21DD09EC의 값이 동일하게 만드는 문제이다.
→ check_password 함수를 자세히 살펴보면, 인자값 p는 char* 형으로 선언되었으나, 함수 내부에선 int* 형으로 캐스팅되어 연산에 사용된다. int는 4바이트이다.
→ 그리고 for문에 의해서 입력한 20바이트를 4바이트 단위로 5번씩 읽어 res에 넣는 작업을 진행한다.
for(i=0;i<5;i++)
{
res+= ip[i];
}
→ 즉, res 값을 0x21DD09EC로 만들어야 하는데, 이를 5번에 걸쳐 더해야 하므로 값을 5로 나눈다.
→ 0x21DD09EC / 0x5 = 0x6c5cec8 이지만, 역으로 계산하여 0x6c5cec8 * 0x5 = 0x21dd09e8이 나온다. 기존의 만드려는 값끼리 빼면 0x21dd09ec-0x21dd09e8 = 0x4가 나온다. 즉 5로 나눈 나머지의 값이 0x4이다.
→ 이제 그냥 해당 값을 넣어주면 된다.
→ 나머지가 없다면 인자 값으로 0x6c5cec8*0x5 한 값을 넣으면 되지만, 나머지 0x4가 존재하므로 마지막 값에는 0x4를 더한 값을 넣는다.
→ 파이썬을 통해 인자값을 구성한다.
./col `python -c 'print "\xc8\xce\xc5\x06"*4+"\xcc\xce\xc5\x06"'`
→ 5번에 걸쳐넣는 작업을 4번만 곱해서 넣은 후, 마지막에 한번 더할 때, 나머지 값인 0x4를 더하여 넣는다. 0x6c5cec8+0x4 = 0ㅌ6c5cecc인 값이다.
-> 공격을 수행하면 다음과 같이 해결된다.
'Wargame > pwnable.kr Challenge' 카테고리의 다른 글
[Toddler's Bottle] random (0) 2019.02.19 [Toddler's Bottle] flag (0) 2019.02.14 [Toddler's Bottle] bof (0) 2019.01.22 [Toddlers's Bottle] fd (0) 2019.01.10 댓글