[풀이] wtf

해킹대회 문제 풀이 연습장소

Moderator: amesianx

Post Reply
hackhack
Posts: 14
Joined: Mon Sep 26, 2016 1:12 am

[풀이] wtf

Post by hackhack » Mon Oct 03, 2016 7:48 pm

일단, 바이너리만 보면 쉬운 문제입니다. 숫자를 입력받고, 그 입력받은 숫자를 크기로 해서 스택에 값을 읽어줍니다. 32 초과일때 32로 초기화하는것 같지만, 사실 해당 변수 타입이 int라서, -1 를 입력하면 그대로 -1 로 입력되고, my_fgets 함수에서는 -1 씩 감소시키면서 0이 되거나 입력이 \n일때 중지하므로, -1 를 크기로 입력하면, 크기제한 bypass가 가능합니다. 이 사실을 이용하여, 바이너리 내에 이미 존재하는 win 함수로 리턴하기만 하면 됩니다. 바이너리 자체로 익스플로잇하면 잘 됩니다.
하지만, 문제에서 요구하는것은, 해당 주어진 파이썬 스크립트에서 payload를 입력받아 해당 프로세스에 write 해주는 방식을 익스플로잇 해야됩니다. 이 방식에서는, payload를 보내면, 나누거나 시간을 두고 write 하는게 아니라, 한꺼번에 write 해버립니다. 즉, 모든 입력이 scanf 로 들어가버리면서, 뒤에 입력들이 전부 무시되게 됩니다.
그럼 어떻게 하면 될까요?
scanf함수도, 모든 입력을 그대로 받아버리는건 아닐겁니다. 생각해보면 가능성은 단 한가지밖에 없죠. scanf 함수에서, 특정 길이만큼의 버퍼씩 받아서 처리하고, 이 사실을 이용하여, scanf가 더이상 읽지 않도록 만들고, 뒤에 my_fgets 에서 제대로 값을 읽을 수 있도록 하는 방법이 있죠.

Post Reply

Who is online

Users browsing this forum: No registered users and 21 guests