Pwnable.Dragon 풀이.
내 동생을위한 RPG 게임을 만들었다.
하지만 그를 속일거야. 나는 이기기가 불가능 해.
그가 나에게 너무 화를 내지 않기를 바란다 : p! 라고 써 있다.
다운로드 링크가 따로 있고, Running at에 있는 것을 봐서는 UAF과 같이 풀이 방식과 접근 방식이 비슷할 것이다.
일단 dragon 파일을 다운로드하고, 프로그램을 동작하면 영웅 두 종류를 선택할 수 있다.
프리스트와 나이트를 고를 수 있는데, 하나 선택하면 게임이 시작한다.
일단 1번 Priest를 선택하니 위의 화면과 동일하게 떴다.
애기 드래곤이 등장했다. 아마 엄마 드래곤(=The Dragon)도 있는 거 같다.
임의로 1번을 계속 선택하니까 패배했고, 애기 드래곤은 1판마다 HP를 회복한다.
음............ 공격을 쎄게 하던가, 드래곤 체력을 낮추어야 될 거 같다.
이번에는 임의로 2번을 계속 눌렀다.
엄마 드래곤은 턴마다 4를 회복한다.
즉 공격을 쎄게 하던가, 드래곤 체력을 낮춰야 된다는 사실을 다시 알 수 있다.
일단 IDA를 이용해 디버깅을 해보면 main 함수는 딱히 중요한 건 없고 PlayGame 함수를 호출해서 게임을 진행한다.
HexRay를 IDA에 연동해야 C 코드를 볼 수 있는데.. https://hex-rays.com/ 여기서 설치하면 된다.
일단 옆 Function name를 주목해야 한다.
main 아래부터 PlayGame, FightDragon, PriestAttack, PrintPlayerInfo, PrintMonsterInfo, GetChoice, SecretLevel 들을 살펴봐야된다.
뭔가 SecretLevel부터 심상치 않은 거 같다.
일단 Playgame() 함수부터 살펴보자.
직업 선택 창을 출력해주는 메시지가 있고, Dragon 프로그램이 동작했을 때처럼 1 or 2로 직업을 선택하면
선택한 값이 result라는 변수에 담기며 FightDragon이라는 함수를 호출한다.
주요한 것은 3을 선택하면 SecretLevel이란 함수를 호출하는 것도 알 수 있다.
그 다음 FightDragon 함수다.
ptr 변수에 int 타입으로 16진수 10을 16만큼 메모리를 할당해준다.
v5에도 동일하게 할당해준다.
v1은 count++라는 변수를 사용해서 Loop가 지날 때마다 v1에 값이 1씩 증가한다.
if문은 v1이 첫번째, 즉 첫번째 턴이 되면 The Dragon == 엄마 드래곤 나오고, 첫번째 턴이 아니면 애기 드래곤이 등장한다.
계속해서 보면 1 or 2를 선택한 직업에 대한 플레이어 정보를 알려준다.
v3 변수 부분이 if 문에 있는데 드래곤을 잡을 때의 문장을 출력한다.
그 후 ptr 변수를 가리켜서 메모리 할당을 free로 해제시킨다.
그리고 에섬블리어로 보면 frenzy라는 스킬을 사용했을 떄의 문장이 나온다.
frenzy라는 스킬은 사용했을 때 hp를 20만큼 써서 40의 데미지를 입히는 기술이다.
스택에 28만큼, 28은 10진수로 변환할 시 40이다. 즉 40의 데미지를 주는 것을 알 수 있다.
그 다음 eax가 28만큼의 공간을 확보한 후 hp의 값을 -20 한다.
마지막에는 역시 free 함수를 호출해서 메모리를 해제시키고 FightDragon은 종료된다.
계쏙 dragon priest를 본다.
스킬을 선택하여 드래곤에게 데미지를 가하고 드래곤을 그 때마다 체력 회복을 한다.
체력회복을 하는 구간을 보면 데미지를 입힐 땐 dword 방식이지만, 드래곤이 체력을 회복할 땐 byte다.
맨밑에 ptr를 프리시켜준 후 한번 더 프리를 시켜주는데 여기서 아마 더블 프리 버그가 발생하나 본다.
Knight도 동일하게 free된 ptr을 한 번 더 프리 시킨다.
SecretLevel를 보면 열자리의 패스워드를 입력받아 문자열을 비교한 후 프로그램이 끝난다.
'# Related site issues > PW.KR' 카테고리의 다른 글
Pwnable.flag. (0) | 2018.04.06 |
---|---|
Pwnable.bof. (0) | 2018.04.05 |
Pwnable.collision. (0) | 2018.04.05 |
Pwnable.UAF. (0) | 2018.04.05 |
Pwnable.Passcode. (0) | 2018.03.28 |